2010-10-20 22 views
32
<%= render :partial => 'event', :collection => @events.sort_by(&:event_at)%> 

Ten kod przedstawia kolekcję zamawianą jako ASC, ale chcę zamówić tę kolekcję jako DESC.Zamów kolekcję jako DESC

Jak mogę to osiągnąć?

Odpowiedz

53

Co więcej, możesz ustawić zakres, aby posortować wydarzenie i użyć go w swoim renderingu.

w modelu zdarzenia:

scope :desc, order("events.event_at DESC") 

Jeśli używasz Rails3 Państwa zdaniem można po prostu zrobić:

<%= render @events.desc %> 
+0

Im używasz szyn 2.3.5 :( –

+2

Wtedy nie ma problemu, po prostu dostosuj mój przykład: 'named_scope: desc,: order => (" events .event_at DESC ")' i '<% = render: partial => 'event',: collection => @ events.desc%>' – Yannis

+0

Mam problem z błędem przy próbie tego. W event.rb w modelach napisałem named_scope : desc,: order => ("events.event_at DESC"), a następnie próbował wywołać go za pomocą <% = render: partial => 'event',: collection => @ events.desc%> ale dostałem komunikat o błędzie : undefined metoda 'desc 'dla #

4

W zależności od rodzaju posiadanego obiektu będziesz mieć różne sposoby wykonywania funkcji sortowania.

Jeśli przedmiot jest ActiveRecord, można zrobić to w następujący sposób:

@events.order('events.event_at DESC') 

Spowoduje to dodanie klauzuli ORDER zapytaniu SQL, sortowania wpisów zanim je pobrać z bazy danych.

Drugie rozwiązanie jest wolniejsze, ponieważ sortujesz wpisy w ruby.
Ale jeśli manipulujesz szeregiem obiektów, to jest to jedyne rozwiązanie.

@events.sort {|a,b| b.event_at <=> a.event_at } 

Ta pętla po wszystkich wydarzeniach, sprawdzając każdy z nich na największą jednego z metodą <=>.

Możesz również zobaczyć the sort documentation na liście.

+0

Przepraszamy, ale jestem nowicjuszem w rubinach i szynach. Co oznacza a, b oznaczać? Czy możesz napisać przykład z prawdziwymi imionami? Najlepiej jeśli events_at –

+0

aib to dwa elementy tablicy. Określasz, że chcesz drugi przed pierwszym. –

+0

Twój przykład powinien być: <% = render: partial => 'event',: collection => @ events.sort {| a, b | b.event_at <=> a.event_at}%> – Yannis

8

Można po prostu odwrócić kolekcję posortowaną:

<%= render :partial => 'event', :collection => @events.sort_by(&:event_at).reverse %> 

, ale jak mówi Yannis, lepiej sortować, jak najlepiej pobrać dane z bazy danych.

+0

To sprawiło, że działało. Ale chcę wypróbować inne przykłady uczenia się. –

10

W Rails 3 poprawna składnia jest:

<%= render :partial => 'event', :collection => @events.order(:event_at).reverse_order %> 
1

Można to zrobić za pomocą desc metodę z parametrem.

Poniżej przykład

@events.desc(:event_at) 

To daje @events w porządku malejącym event_at dziedzinie.

Dzięki.