E 'una scorciatoia per .to_a.find { ... }
. Ecco il metodo del source code:
def find(*args)
if block_given?
to_a.find(*args) { |*block_args| yield(*block_args) }
else
find_with_ids(*args)
end
end
Se si passa un blocco, chiama .to_a
(caricamento di tutti i record) e invoca Enumerable#find
sulla matrice.
In altre parole, consente di utilizzare Enumerable#find
su un ActiveRecord::Relation
. Questo può essere utile se la tua condizione non può essere espressa o valutata in SQL, ad es. l'interrogazione serialized attributes:
Consumer.find { |c| c.preferences[:foo] == :bar }
Per evitare confusione, preferisco la versione più esplicito, però:
Consumer.all.to_a.find { |c| c.preferences[:foo] == :bar }
Ma 'Consumer.to_a' non è definito, è vero? Una classe che eredita da ActiveRecord :: Base non è un'istanza di ActiveRecord :: Relation. –
@Save hai ragione, devi chiamare '.all.to_a'. Avrei dovuto testare il mio codice. – Stefan