Eager loading: Der richtige Weg, Dinge zu tun
Ich bin mit Ruby on Rails 3.1. Ich Lesen Sie den folgenden Artikel und Dokumentationen über eager loading und ich würde gerne einen richtigen Weg, Dinge zu tun:
- Eager Loading Verbände [Offizielle Dokumentation]
- ActiveRecord::Associations::ClassMethods (siehe Abschnitt "Eager loading of associations") [Offizielle Dokumentation]
- Eager loading [Blog Artikel]
Den #2 sagt:
Beachten Sie, dass die Verwendung von Bedingungen wie Post.enthält([:Autor :comments]).where(['Kommentare.zugelassen = ?', true]).alle kann unbeabsichtigte Folgen haben.
Den #3 sagt, dass die unbeabsichtigten Konsequenzen sind (Hinweis: Beispiele sind ziemlich ähnlich, also ich zitiere den genauen text von der blog-Artikel, aber Sie haben im Auge zu behalten, die Abhilfe, die nicht die spezifische Implementierung):
Diese Abfrage, da es mit einem LEFT JOIN würde auch verwerfen alle posts ohne ein Kommentar mit dem Wort "erste" auf einem der Kommentare.
Ist, wenn es nicht "assoziierten" Objekte, die "wesentlichen Zusammenhang" Objekt nicht geladen werden. Dies ist, was passiert, wenn ich versuche, mit eager loading von hinzufügen einer Bedingung wie .where(:category_relationships => {:user_id => @current_user.id})
in einem meiner Vorherige Frage, aber ich will nicht, dass das passiert.
So (pessimistisch, weil ich wahrscheinlich nicht verwenden können, die eager loading in meinem Fall, wo Zustand kann nicht gesetzt werden, in der has_many
Anweisung - beachten Sie, dass im obigen code die @current_user.id
ist "dynamisch gesetzt" anders als in den Beispielen vorhanden, die in genannten Gebieten), ich würde gerne wissen, ob es pratiques/Techniken/Strategien so zu begrenzen, Datenbank-Abfragen, da ich eine "N + 1 problem".
Vielleicht pratiques/Techniken/Strategien sind umsetzbar durch mit dem framework Ruby on Rails an alle... die #1 sagt:
Obwohl Active Record: hier können Sie Bedingungen angeben, an die eifrigen
geladen Verbände ebenso wie joins, der empfohlene Weg ist die Verwendung
Verknüpfungen statt.
Was und wie, dieses Problem zu lösen, der richtige Weg?
Vielleicht eine Lösung zu Holen und mir selbst zu bauen, was geladen werden muss, von denen bestimmte und getrennte Datenbank-Abfragen, aber dann wäre das problem wie "pass" /"Partner" /"interpolieren" diejenigen, die abgerufen werden "assoziierten" Objekte "main verbunden" - Objekt so, dass diejenigen, die verwendet werden können, "a là eager loading" Weg? Das ist, wie möglich zu machen (siehe die erwähnten Frage weitere Informationen) verwenden Sie code wie @article.comments
und Holen Sie sich nur die Kommentare, die ich eifrig geladen mir? Nach meine eager loading, ist es möglich /richtige, etwas zu machen, wie @article.comments = my_eager_loaded_comments
also auf "pass"/"Partner"/"interpolieren" Kommentare zu den Artikeln?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist möglich. Ich mache das regelmäßig.
Beachten Sie, dass meine Lösung immer noch ruft ALLE zugehörigen Objekte aus der DB. Ich glaube nicht, dass es keine Lösung für das abrufen nur die gefilterten association-Objekte, wenn Ihr Zustand ist dynamisch. Meine Lösung konzentriert sich auf die Filterung der abgerufenen association-Objekte.
Ich gehe davon aus, dass die Anforderung an
get a list of articles
und in jedem Artikel,eager load the comments of only one particular user
.In der
Article
Modell:In der Auflistung der Artikel zurückgegeben, die durch die oben beschriebene Methode, die Kommentare Vereins werden nur die Kommentare des jeweiligen Benutzers.
Ich hoffe das ist was Ihr bittet.
has_many :through
Vereins. Wie ist das in der Lösung verwendet werden, die im Zusammenhang mit dieser Frage?Aus #2 ActiveRecord::Associations::ClassMethods kommt das:
Wenn verstehe ich das richtig im Kontext, gibt es eine Mehrdeutigkeit, wenn Sie sich bewerben .wo (), um Ihre Haupt-Abfrage mit ein schließt () und AR gilt das, wo die gesamte Abfrage an, dass Ihre Prinzip die Ergebnisse mit denen, die qualifizierte verbundenen Prädikate. Aber wenn Sie Rahmen das Prädikat nur für den Verein wie oben, AR versteht, und gibt Ihnen alle Ihre Prinzip resultiert und diese verknüpften Objekte, die mit Ihrer Prädikat Bedingung.
has_many
Verein wie du schreibst da in meinem Fall sollte ich etwas wiehas_many, :conditions => ['user_id = ?', @current_user.id]
(es ist nicht möglich! ... natürlich für meine Kenntnisse). Also ich würde gerne wissen eine Lösung zu diesem Problem überhaupt im Zusammenhang der 'eager loading' - Funktionalität.