Rails "find_all_by" vs ".where"
My opinion is that using .where
is a better approach.
When you use attribute based finders, you are going to have to tunnel through a method missing call and eventually define a class method, via class_eval
, that returns your result. This is extra processing that you may not need to do.
Also, stringing together: find_by_this_and_this_and_this_and_this... can get ugly.
See how rails accomplishes attribute based finders here
Method missing from module DynamicMatchers on github:
def method_missing(name, *arguments, &block) match = Method.match(self, name) if match && match.valid? match.define send(name, *arguments, &block) else super endend
I think the main advantage is being able to add additional criteria to where, find_all_by is limited to the field of the dynamic selector. If you only have one condition you are searching by then I think it is a wash, but when you start adding 3 or 4, dynamic finders can be ugly. Hashes are nice to look at, and you could pass a hash of conditions as a parameter if needed. Dynamic finders are cool, but I think where scales in a cleaner way and is more readable.