Se ho un oggetto con una collezione di oggetti figlio in ActiveRecord, cioètipi di Ruby di collezioni in ActiveRecord
class Foo < ActiveRecord::Base
has_many :bars, ...
end
e si tenta di eseguire il metodo di Array find
contro quella collezione:
foo_instance.bars.find { ... }
Ricevo:
ActiveRecord::RecordNotFound: Couldn't find Bar without an ID
Presumo che ciò sia dovuto al fatto che ActiveRecord ha dirottato loMetodoper i propri scopi. Ora, posso usare detect
e tutto va bene. Tuttavia, per soddisfare la mia curiosità, ho cercato di usare metaprogrammazione per rubare esplicitamente il metodo find
posteriore per una corsa:
unbound_method = [].method('find').unbind
unbound_method.bind(foo_instance.bars).call { ... }
e ricevo questo errore:
TypeError: bind argument must be an instance of Array
così chiaramente di Ruby non pensa foo_instance.bars
è un array e tuttavia:
foo_instance.bars.instance_of?(Array) -> true
qualcuno può aiutarmi con una spiegazione di questo e di un modo per aggirare l'ostacolo con metaprogramm ing?
Per chiarire qui, il metodo .all in realtà recupera tutti i modelli associati che possono avere un enorme impatto sulla memoria a seconda del tipo di associazione. Ad esempio, se fosse Utente ha_molti: post, potresti recuperare l'intera cronologia di registrazione di un utente che potrebbe essere una notevole quantità di dati. Ove possibile, provare e costruire una chiamata di ricerca con condizioni o ambiti nominati per prestazioni migliori. – tadman