2010-07-07 13 views
22

Jeśli mam następujące,Limit każdy zrobić pętlę

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

<% end %> 

W jaki sposób można ograniczyć go tylko pokazać 10 ostatnich wyników

+3

Dlaczego nie można po prostu rodzaj, a następnie pokroić tablicę zdobyć pierwszy 10? –

Odpowiedz

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

Jednak to prawdopodobnie najlepiej wepchnąć to do takiego modelu, jak

<% @feed.recent(10).each do |feed| %> 

I rzeczywiście, jeśli @feed pochodzi z bazy danych, bym dociśnij ją jeszcze dalej: to nie ma sensu, aby załadować mnóstwo nieposortowane wpisów wysunąć z DB, a następnie posortować je i następnie wyrzuć większość z nich. Lepiej pozwolić DB na sortowanie i filtrowanie.

Zobacz odpowiedź @Peer Allana, jak to zrobić w ActiveRecord. W ARel (IOW: Szyny 3) byłoby prawdopodobnie jeszcze prostsze, coś

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

Jeśli chcę używać "@ feed" dwa razy: jeden do pokazania 10, drugi do pokazania wszystkiego, to lepiej dla mnie ograniczyć go do widoku z 'recent (10)', następnie następną normalną pętlą for '@feed '. – Victor

8

Zgadzam się z innymi (Jörg w szczególności); ale jeśli nadal chcesz wiedzieć, jak ograniczyć samą pętlę, przydatne może być break.

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

Istnieje wiele lepszych metod ograniczania liczby wyświetlanych elementów, niż przerwanie pętli: operator 'pierwszy' i' [] 'działa bardzo dobrze w takim scenariuszu. –

+0

Nie wiem o "lepszym", ale inne odpowiedzi są z pewnością ładniejsze, na co szczególnie zwracam uwagę. "Lepsze" jest bardzo sytuacyjne; Mogę wskazać, że proponowane przez ciebie metody tworzą nowy układ, podczas gdy mój nie. Chodzi o to, skoro pozostałe odpowiedzi skupiały się już na ograniczeniu samej kolekcji, odpowiedziałem na dosłowne pytanie, dodając kolejną opcję: zakładając pętlę nad całą kolekcją, jak uruchomić tylko 10 razy maks. To nie jest rozwiązanie, które wybrałbym, chyba że zostałbym naciągnięty na czas, ponieważ czyni kod brzydszym. – Amadan

+0

Tak, to głównie kwestia stylu. Ale jeśli istnieje bezpośrednia koncepcja wyrażająca zamiar programisty (np. '' Pierwszy', '[]' i 'order (...). Take (10)' szczególnie) Osobiście uważam, że bardziej pociąga to używanie. –

5

Plik created_at wydaje się wskazywać, że używasz ActiveRecord w Railsach, aby ustawić zmienną @feed. Jeśli tak jest, lepiej jest wykonać tę pracę w SQL. Jest znacznie wydajniejszy i łatwiejszy w obsłudze.

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

W przeciwnym razie, jeśli naprawdę chcesz użyć widoku w tym celu można użyć pierwszego lub zakres

<% @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

Poniższy kod zwróci 10 ostatnich rekordów.

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

Array Reference

+1

Awesome. Pozwala to na ograniczenie _czasu wykonywania sortowania.W moim przypadku skupiam się na największej liczbie skojarzeń polimorficznych. Nie mogę napisać dla niego zapytania (nie wiem jak!). To działa ładnie. – mattd

9

zrobiłbym to tak:

<% @array.limit(10).each do |a| %> 
Powiązane problemy