2010-07-07 12 views
22

Wenn ich die folgende haben,Grenze jeder do-Schleife

<% @feed.sort_by{|t| - t.created_at.to_i}.each do |feed| %> 

<% end %> 

Wie kann es nur begrenzen zeigen die 10 neuesten Ergebnisse

+3

Warum Sie zuerst sortieren nicht nur und dann schneiden Sie das Array den ersten 10 zu bekommen? –

Antwort

60
<% @feed.sort_by{|t| - t.created_at.to_i}.first(10).each do |feed| %> 

Es ist jedoch wahrscheinlich am besten, um dies in das Modell wie folgt zu drücken

Und in der Tat, wenn @feed aus einer Datenbank kommt, würde ich es noch weiter nach unten drücken: Es macht keinen Sinn, eine Tonne unsortierte Feed-Einträge aus der DB zu laden, dann sortieren und dann werfe die meisten weg. Lass die DB besser sortieren und filtern.

Siehe @Peer Allans Antwort für die Vorgehensweise in . In ARel (IOW: Rails 3) wäre es wahrscheinlich noch einfacher, so etwas wie

Feed.all.order('created_at DESC').take(10) 
+0

Wenn ich '@ feed' zweimal verwenden möchte: eins zum Anzeigen von 10, ein anderes zum Anzeigen von allen, ist es besser für mich, es mit' recent (10) 'einzuschränken, dann die nächste normale for-Schleife für' @feed '. – Victor

8

ich mit den anderen (Jörg insbesondere) zustimmen; Aber wenn Sie immer noch wissen möchten, wie Sie die Schleife selbst begrenzen können, kann break nützlich sein.

@array.each_with_index do |feed, i| 
    break if i == 10; 
    # ... 
+0

Es gibt viel bessere Methoden, um die Anzahl der angezeigten Elemente zu begrenzen, als die Schleife zu durchbrechen: 'first' und' [] 'operator funktionieren in einem solchen Szenario sehr gut. –

+0

Ich weiß nichts von "besser", aber andere Antworten sind sicherlich schöner, worauf ich besonders hinweise. "Besser" ist sehr situativ; Ich möchte darauf hinweisen, dass die von Ihnen vorgeschlagenen Methoden ein neues Array erstellen, während dies bei mir nicht der Fall ist. Der Punkt ist, da die anderen Antworten bereits auf die Begrenzung der Sammlung selbst konzentriert waren, beantwortete ich nur die wörtliche Frage, eine weitere Option hinzufügend: die Schleife über die gesamte Sammlung voraussetzend, wie man nur in 10mal maximal läuft. Es ist keine Lösung, die ich wählen würde, wenn ich nicht auf Zeit gedrückt würde, da es den Code hässlicher macht. – Amadan

+0

Ja, es ist meistens Stilsache. Aber wenn es ein direktes Konzept gibt, das die Absicht eines Programmierers ausdrückt (wie 'first',' [] 'und' order (...). Take (10) 'besonders), finde ich es persönlich ansprechender, es zu benutzen. –

5

Die created_at scheint anzuzeigen, dass Sie ActiveRecord in Rails verwenden, um die @ feed-Variable festzulegen. Wenn dies der Fall ist, sollten Sie diese Arbeit in SQL ausführen. Es ist viel effizienter und einfacher zu handhaben.

@feed = Feed.all(:order => 'created_at DESC', :limit => 10) 

Andernfalls, wenn Sie wirklich der Ansicht verwenden möchten, dies zu tun Sie zuerst oder einen Bereich

<% @feed.sort_by{|t| - t.created_at.to_i}[0..9].each do |feed| %> 
<% @feed.sort_by{|t| - t.created_at.to_i}.first(10).each do |feed| %> 
6

Der folgende Code 10 den letzten Datensätze zurückgeben können.

@feed = @feed.sort! { |a,b| b.created_at <=> a.created_at }.take(10) 

Array Reference

+1

Ehrfürchtig. Dies erlaubt Ihnen, _nach_ der Sortierung zu begrenzen.In meinem Fall sortiere ich nach der höchsten Anzahl von polymorphen Assoziationen. Ich kann keine Abfrage dafür schreiben (weiß nicht wie!). Das funktioniert gut. – mattd

9

ich es so tun würde:

<% @array.limit(10).each do |a| %>