Wie machst du eifriges Laden mit Limits?

9

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%     
Peter Nixey 25.06.2011, 12:06
quelle

3 Antworten

4

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:

%Vor%     
Shane 08.03.2013 00:20
quelle
1

Ich habe wil_paginate verwendet, um mich beim Eager-Laden ( using includes ) zu unterstützen, da ich viele assoziierte Modelle in einem Schritt ohne mit limit

laden muss %Vor%

ODER (ohne will_paginate ( mit limit )

%Vor%

... versuchen Sie es ... hoffe es hilft.

    
Milind 10.06.2014 10:27
quelle
0

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

    
Kir 25.06.2011 13:03
quelle