Dies ist eher eine Frage "Warum funktionieren die Dinge so?" Als eine Frage "Ich weiß nicht, wie ich das machen soll" ...
Das Evangelium zum Abrufen zugehöriger Datensätze, von denen Sie wissen, dass Sie sie verwenden werden, lautet: Verwenden :include
Sie sie, weil Sie einen Join erhalten und eine ganze Reihe zusätzlicher Abfragen vermeiden:
Post.all(:include => :comments)
Wenn Sie sich jedoch die Protokolle ansehen, findet keine Verknüpfung statt:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
Es wird eine Verknüpfung verwendet, da alle Kommentare auf einmal abgerufen werden, aber es handelt sich immer noch nicht um eine Verknüpfung (was in der gesamten Dokumentation zu sagen scheint). Die einzige Möglichkeit, einen Join zu erhalten, besteht darin, :joins
Folgendes zu verwenden :include
:
Post.all(:joins => :comments)
Und die Protokolle zeigen:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Vermisse ich etwas Ich habe eine App mit einem halben Dutzend Assoziationen und auf einem Bildschirm zeige ich Daten von allen an. Es scheint besser zu sein, eine verbundene Abfrage anstelle von 6 Personen zu haben. Ich weiß, dass es in Bezug auf die Leistung nicht immer besser ist, einen Join durchzuführen, als einzelne Abfragen (wenn Sie nach Zeitaufwand arbeiten, scheinen die beiden oben genannten einzelnen Abfragen schneller zu sein als der Join), aber schließlich alle Dokumente Ich habe gelesen, dass ich überrascht bin, dass es :include
nicht wie angekündigt funktioniert.
Vielleicht Rails ist bewusst , die Performance - Problem und kommen nicht außer in bestimmten Fällen?
includes
(für jeden, der dies liest)