2016-09-09 1 views
0

versuchen einfach ... zu verstehen, wenn zu Beginn einig Methode, die ich eifrig Last eines Rekord und die dazugehörigen Kinder wie folgt aus:Wenn ich begierige untergeordnete Datensätze laden möchte, dann bedeutet das, dass zukünftige WHERE-Abfragen die Datenbank nicht mehr durchsuchen werden?

@object = Object.include(:children).where(email:"[email protected]").first 

Dann, dass später bedeuten, wenn ich durch dieses Objekt Kinder kümmern Dies wird nicht mehr Datenbankabfragen generieren?

D.h.

@found_child = @object.children.where(type_of_child:"this type").first 

Antwort

0

Leider nicht - mit Activerecord :: Relation Methoden wie where wird die Datenbank erneut abzufragen.

Sie könnten jedoch die Daten filtern, ohne weitere Abfragen, die Standard-Array/Enumerable Methoden verwenden:

@object.children.detect {|child| child.type_of_child == "this type"} 
+0

ah ich davon hatte Angst ... der Grund, warum ich bin immer noch mit 'where' wird, da die vollständige Erklärung liest' @ object.children.where (type_of_child: "Dieser Typ"). pluck (: menge) .inject (: +) ', aber ich glaube nicht, dass ich Standard-Array-Methoden verwenden kann, um dieses Recht zu duplizieren? – james

+0

Sie würden eher ein Nickerchen als zupfen, aber es wäre ziemlich das Gleiche –

0

Es wird eine weitere Datenbankabfrage in Ihrem Fall generieren.

Eager Laden wird verwendet, um N + 1 Abfragen zu vermeiden. Dies geschieht, indem alle zugehörigen Objekte geladen werden. Dies funktioniert jedoch nicht, wenn Sie diese Liste später mit where filtern wollen. Rails wird dann eine neue Abfrage erstellen und diese ausführen.

Das sagte: In Ihrem Beispiel macht die include Ihren Code tatsächlich langsamer, weil es zugeordnete Objekt lädt, aber nicht verwenden kann.

Ich würde Ihr Beispiel ändern:

@object = Object.find_by(email: "[email protected]") 
@found_child = @object.children.find_by(type_of_child: "this type") 
Verwandte Themen