Wenn ich ein Objekt mit einer Sammlung von untergeordneten Objekten in Activerecord, das heißtRuby-Typen von Sammlungen in Active
class Foo < ActiveRecord::Base
has_many :bars, ...
end
und ich versuche, Array des find
Verfahren gegen diese Sammlung auszuführen:
foo_instance.bars.find { ... }
Ich erhalte:
ActiveRecord::RecordNotFound: Couldn't find Bar without an ID
Ich nehme an, dies liegt daran, dass ActiveRecord dieentführt hatMethode für eigene Zwecke. Jetzt kann ich detect
verwenden und alles ist in Ordnung. Aber meine eigene Neugier zu befriedigen, ich versuchte metaprogramming zu verwenden, um explizit die find
Methode für einen Lauf zu stehlen zurück:
unbound_method = [].method('find').unbind
unbound_method.bind(foo_instance.bars).call { ... }
und erhalte ich diesen Fehler:
TypeError: bind argument must be an instance of Array
so klar ist Rubin nicht denken foo_instance.bars
ist ein Array und doch:
foo_instance.bars.instance_of?(Array) -> true
mir jemand mit einer Erklärung dafür helfen kann und einen Weg um ihn herum mit metaprogramm zu bekommen ing?
Um hier zu verdeutlichen, ruft die .all-Methode tatsächlich alle zugehörigen Modelle ab, die je nach Art der Assoziation einen großen Speichereffekt haben können. Wenn es sich beispielsweise um Benutzer has_many: posts handelt, rufen Sie möglicherweise die gesamte Buchungshistorie eines Benutzers ab, bei der es sich um eine erhebliche Menge an Daten handeln könnte. Versuchen Sie nach Möglichkeit, einen Suchaufruf mit Bedingungen oder benannten Bereichen für eine bessere Leistung zu erstellen. – tadman