<%= 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?
<%= 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?
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 %>
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.
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 –
aeb sono due elementi dell'array. Si specifica che si desidera il secondo prima del primo. –
L'esempio dovrebbe essere: <% = render: partial => 'event',: collection => @ events.sort {| a, b | b.event_at <=> a.event_at}%> – Yannis
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.
Questo ha funzionato. Ma voglio provare gli altri esempi per l'apprendimento. –
In Rails 3 la sintassi corretta è:
<%= render :partial => 'event', :collection => @events.order(:event_at).reverse_order %>
Come descritto a http://guides.rubyonrails.org/active_record_querying.html
@events.order(event_at: :desc)
Questa è la migliore risposta per Rails 3+ perché fa l'ordinamento nel database senza dover scrivere SQL raw. – DaveMongoose
È 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.
Im using rails 2.3.5 :( –
Quindi nessun problema, basta adattare il mio esempio: 'named_scope: desc,: order => (" events .event_at DESC ")' e '<% = render: partial => 'event',: collection => @ events.desc%>' – Yannis
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 # –