It's a shortcut for .to_a.find { ... }
. Here's the method's source code:
def find(*args)
if block_given?
to_a.find(*args) { |*block_args| yield(*block_args) }
else
find_with_ids(*args)
end
end
If you pass a block, it calls .to_a
(loading all records) and invokes Enumerable#find
on the array.
In other words, it allows you to use Enumerable#find
on a ActiveRecord::Relation
. This can be useful if your condition can't be expressed or evaluated in SQL, e.g. querying serialized attributes:
Consumer.find { |c| c.preferences[:foo] == :bar }
To avoid confusion, I'd prefer the more explicit version, though:
Consumer.all.to_a.find { |c| c.preferences[:foo] == :bar }
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…