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
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
<% @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)
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
[1,2,3,4,5].first(3)
=> [1,2,3]
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;
# ...
Istnieje wiele lepszych metod ograniczania liczby wyświetlanych elementów, niż przerwanie pętli: operator 'pierwszy' i' [] 'działa bardzo dobrze w takim scenariuszu. –
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
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. –
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| %>
Poniższy kod zwróci 10 ostatnich rekordów.
@feed = @feed.sort! { |a,b| b.created_at <=> a.created_at }.take(10)
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
zrobiłbym to tak:
<% @array.limit(10).each do |a| %>
Dlaczego nie można po prostu rodzaj, a następnie pokroić tablicę zdobyć pierwszy 10? –