Es ist eine Abkürzung für .to_a.find { ... }
nützlich sein könnte. Hier ist die Methode des source code:
def find(*args)
if block_given?
to_a.find(*args) { |*block_args| yield(*block_args) }
else
find_with_ids(*args)
end
end
Wenn Sie einen Block übergeben, ruft es .to_a
(Laden aller Datensätze) und ruft Enumerable#find
auf dem Array.
Mit anderen Worten, ermöglicht es Ihnen, Enumerable#find
auf einem ActiveRecord::Relation
zu verwenden. Dies kann nützlich sein, wenn Ihre Bedingung nicht in SQL ausgedrückt oder ausgewertet werden kann, z. serialized attributes Abfrage:
Consumer.find { |c| c.preferences[:foo] == :bar }
Um Verwirrung zu vermeiden, würde ich die explizitere Version bevorzugen, aber:
Consumer.all.to_a.find { |c| c.preferences[:foo] == :bar }
Aber 'Consumer.to_a' nicht definiert ist, ist es? Eine Klasse, die von ActiveRecord :: Base erbt, ist keine Instanz von ActiveRecord :: Relation. –
@Da hast du recht, du musst '.all.to_a' anrufen. Ich hätte meinen Code testen sollen. – Stefan