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:

  1. Eager Loading Verbände [Offizielle Dokumentation]
  2. ActiveRecord::Associations::ClassMethods (siehe Abschnitt "Eager loading of associations") [Offizielle Dokumentation]
  3. 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?

InformationsquelleAutor Backo | 2012-03-10
Schreibe einen Kommentar