Use Rails Enums carefully
ActiveRecord enums are really handy but they can be equally evil if not used properly.
Recently we encountered a strange situation where a developer added a simple
has_one
-belongs_to
relationship between two of the models -
Investor
has one BankAccount
. And it did not work!
BankAccount.first.investor
was working but
Investor.first.bank_account
was returning nil
even though the bank_account
existed for that investor.
I went in to debug.
-
Foreign key
bank_account_id
- check -
spellings everywhere - check
-
Try relationship in console - fails
Why on earth was a simple relationship like this failing?
We have used this hundreds of times! It should just work!
After spending a good 20mins into this, found out that there was an enum defined on
Investor
with the name bank_account
. Bam!
ActiveRecord enums
are very useful in the way they map domain level states to integers in database
(or even enums in case of postgres), but what they do is monkey-patch
activerecord with various methods corresponding to the enums.
And in this case the enum method #bank_account
took priority over the relation method with the same name.
TLDR;
Use enums carefully and sparingly keeping in mind the plethora of methods it defines on your model.