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

Questo codice mostra una raccolta ordinata come ASC, ma voglio ordinare questa raccolta come DESC.Ordina una raccolta come DESC

Come posso ottenere questo risultato?

risposta

53

Ancora meglio, è possibile impostare un ambito per ordinare l'evento e utilizzarlo nel rendering.

nel modello evento:

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

Se si utilizza Rails3, a suo avviso si può semplicemente fare:

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

Im using rails 2.3.5 :( –

+2

Quindi nessun problema, basta adattare il mio esempio: 'named_scope: desc,: order => (" events .event_at DESC ")' e '<% = render: partial => 'event',: collection => @ events.desc%>' – Yannis

+0

Ho riscontrato un errore nel provare questo. In event.rb nei modelli ho scritto named_scope : desc,: order => ("events.event_at DESC") e poi ho provato a chiamarlo con <% = render: partial => 'event',: collection => @ events.desc%> ma ho ricevuto il messaggio di errore : metodo non definito 'desc 'per #

4

A seconda del tipo di oggetto in uso, si avranno modi diversi per eseguire la funzione di ordinamento.

Se l'oggetto è un ActiveRecord, è possibile farlo nel modo seguente:

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

Questo aggiungerà una clausola ORDER alla query SQL, l'ordinamento le voci prima di recuperare dal database.

La seconda soluzione è più lenta, come si stanno classificando le voci in rubino.
Ma se stai manipolando una serie di oggetti, è la tua unica soluzione.

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

Questo ciclo volontà attraverso tutti gli eventi, controllando ognuno di loro per il più grande con il metodo <=>.

È inoltre possibile vedere the sort documentation in Enumerables.

+0

Scusate ma sono un principiante su rubino e rotaie. A cosa serve a, b? Puoi scrivere un esempio con nomi reali? Preferibilmente con events_at –

+0

aeb sono due elementi dell'array. Si specifica che si desidera il secondo prima del primo. –

+0

L'esempio dovrebbe essere: <% = render: partial => 'event',: collection => @ events.sort {| a, b | b.event_at <=> a.event_at}%> – Yannis

8

Si può solo invertire la raccolta differenziata:

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

ma come dice Yannis, è meglio scegliere l'ordinamento quando si recuperano le cose dal database in modo ideale.

+0

Questo ha funzionato. Ma voglio provare gli altri esempi per l'apprendimento. –

10

In Rails 3 la sintassi corretta è:

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

È possibile farlo utilizzando desc metodo con il parametro.

Vedere sotto esempio

@events.desc(:event_at) 

Questo vi darà @events in ordine decrescente di event_at campo.

Grazie.