Encomendar uma colecção como DESC
<%= render :partial => 'event', :collection => @events.sort_by(&:event_at)%>
este código mostra uma colecção ordenada como ASC, mas eu quero encomendar esta colecção como DESC.
Como posso conseguir isso?7 answers
Ainda melhor, você pode definir um escopo para classificar o seu evento e usá-lo em sua renderização.
No seu modelo de Evento:
scope :desc, order("events.event_at DESC")
Se utilizar o Rails3, na sua opinião pode simplesmente fazer:
<%= render @events.desc %>
Como descrito em http://guides.rubyonrails.org/active_record_querying.html
@events.order(event_at: :desc)
Nos carris 3 a sintaxe correcta é:
<%= render :partial => 'event', :collection => @events.order(:event_at).reverse_order %>
Podes reverter a colecção ordenada:
<%= render :partial => 'event', :collection => @events.sort_by(&:event_at).reverse %>
Mas como o Yannis diz, é melhor separar as coisas da base de dados, idealmente.
Se o seu objecto é um ActiveRecord, pode fazê-lo da seguinte forma:
@events.order('events.event_at DESC')
Isto irá adicionar uma cláusula ORDER
à sua consulta SQL, ordenando os itens antes de os Obter da base de dados.
A segunda solução é mais lenta, já que está a ordenar as suas entradas em ruby.
Mas se você está manipulando uma série de objetos, é o seu único solucao.
@events.sort {|a,b| b.event_at <=> a.event_at }
Isto irá percorrer todos os eventos, verificando cada um deles para o maior com o método <=>
.
Você também pode ver a documentação de ordenação sobre enumeráveis.
Você pode fazer isso usando o método desc
com parâmetro.
Ver abaixo exemplo
@events.desc(:event_at)
Isto dar-lhe-á @events por ordem decrescente de event_at
Campo.
@teams = Team.all.order(points: :desc)