In der Dokumentation zum eifrigen Laden heißt es:
Wenn Sie eine Verknüpfung mit einer angegebenen: limit-Option laden möchten, wird sie ignoriert und alle zugehörigen Objekte werden zurückgegeben:
%Vor%Bild.find (: zuerst,: include = & gt;: most_recent_comments) .most_recent_comments # = & gt; gibt alle zugehörigen Kommentare zurück.
Wenn dies der Fall ist, was ist der beste Weg, um das "Limit" beim Laden zu erreichen?
Nehmen wir an, wir laden die letzten zehn Blogposts auf die erste Seite eines Blogs, wir wollen sie natürlich nicht alle, also sollten die Grenzen und die Reihenfolge der Postsammlungen festgelegt werden?
Kann man darüber hinaus dieselben Bedingungen für Elemente festlegen, die tief geladen sind - zum Beispiel nur die ersten drei Kommentare zu jedem Blogbeitrag anzeigen?
%Vor% Ich glaube, das liegt daran, dass der LIMIT
-Befehl in sql nicht gut in das übersetzt, was Sie versuchen zu tun. LIMIT
begrenzt die Anzahl der von der Abfrage zurückgegebenen Zeilen. Du versuchst das aber nicht. Sie versuchen, die Anzahl der verbundenen Zeilen für jedes zurückgegebene Bild zu begrenzen. Um diesen Effekt zu erzielen, müssten Sie komplexes SQL verwenden, das bei großen Tabellen nur schwer zu optimieren ist. An diesem Punkt würde ich überlegen, warum Sie versuchen, die geladenen Zeilen zu begrenzen.
Wenn die maximale Anzahl von geladenen Kommentaren verwaltbar ist (& lt; 2000 oder so), sollten Sie sich wahrscheinlich keine Sorgen über die Begrenzung des SQL-Endes machen.
Wenn Sie nur 10 Posts laden, würde ich überhaupt nicht eifrig laden. Ich würde nicht erwarten, dass zusätzliche 10 Abfragen die Vorgänge verlangsamen, und welche Zeit sie hinzufügen, könnte man durch andere Optimierungstechniken wie Caching nachholen.
Sie sollten Scopes die Drecksarbeit für Sie erledigen lassen, nicht die Assoziation. Dies fördert Wiederverwendbarkeit, Wartbarkeit, Lesbarkeit. Beispiel:
%Vor% Auf diese Weise ist .comments
da, wenn Sie es brauchen, und Sie können es auch so eingrenzen:
Sie können diese Konstruktion verwenden:
Picture.find(:first, :include => :most_recent_comments).most_recent_comments.limit(10)
Weitere Informationen finden Sie in AR-Leitfaden
Tags und Links optimization ruby-on-rails activerecord eager-loading