Dies ist eher eine "Warum funktionieren die Dinge so?"-Frage als eine "Ich weiß nicht, wie man das macht"-Frage...
Das Evangelium über das Abrufen von verknüpften Datensätzen, von denen Sie wissen, dass Sie sie verwenden werden, lautet also :include
denn Sie erhalten eine Verknüpfung und vermeiden eine ganze Reihe von zusätzlichen Abfragen:
Post.all(:include => :comments)
Wenn Sie sich jedoch die Protokolle ansehen, findet keine Verbindung 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 est ist eine Abkürzung, weil sie alle Kommentare auf einmal zieht, aber es ist immer noch keine Verknüpfung (was die gesamte Dokumentation zu sagen scheint). Der einzige Weg, wie ich eine Verknüpfung erhalten kann, ist die Verwendung von :joins
anstelle von :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
Habe ich etwas verpasst? Ich habe eine App mit einem halben Dutzend Assoziationen, und auf einem Bildschirm zeige ich Daten von allen an. Es scheint, als ob es besser wäre, eine einzige verknüpfte Abfrage zu haben, anstatt 6 einzelne. Ich weiß, dass es von der Leistung her nicht immer besser ist, eine Verknüpfung statt einzelner Abfragen durchzuführen (wenn man nach der verbrauchten Zeit geht, sieht es so aus, als ob die beiden obigen einzelnen Abfragen schneller sind als die Verknüpfung), aber nach all den Dokumenten, die ich gelesen habe, bin ich überrascht zu sehen :include
nicht wie angekündigt funktioniert.
Vielleicht Rails est sich des Leistungsproblems bewusst ist und nur in bestimmten Fällen beitritt?