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

Este código muestra una colección ordenada como ASC, pero quiero pedir esta colección como DESC.Solicite una colección como DESC

¿Cómo puedo lograrlo?

Respuesta

53

Mejor aún, puede establecer un alcance para ordenar su evento y utilizarlo en su procesamiento.

En su modelo Evento:

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

Si utiliza Rails3, en su opinión, sólo tiene que hacer:

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

Estoy usando rails 2.3.5 :( –

+2

Entonces no hay problema, solo adapte mi ejemplo: 'named_scope: desc,: order => (" events .event_at DESC ")' y '<% = render: partial => 'event',: collection => @ events.desc%>' – Yannis

+0

Me equivoqué al intentar esto. En event.rb en modelos escribí named_scope : desc,: order => ("events.event_at DESC") y luego intenté llamarlo con <% = render: partial => 'event',: collection => @ events.desc%> pero obtuve el error : método undefined 'desc 'para #

4

Según el tipo de objeto que tenga, tendrá diferentes formas de realizar la función de ordenación.

Si el objeto es un ActiveRecord, puede hacerlo de la siguiente manera:

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

Esto agregará una cláusula ORDER a la consulta SQL, la clasificación de las entradas antes de que se recupere de la base de datos.

La segunda solución es más lenta, ya que está ordenando sus entradas en ruby.
Pero si está manipulando una matriz de objetos, es su única solución.

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

Este bucle a través de todos los eventos, la comprobación de cada uno de ellos por el más grande con el método <=>.

También puede ver the sort documentation en Enumerables.

+0

Lo siento pero soy un novato en ruby ​​y rieles. ¿Qué significa a, b? ¿Puedes escribir un ejemplo con nombres reales? Preferiblemente con events_at –

+0

ayb son dos elementos de la matriz. Usted especifica que desea el segundo antes del primero. –

+0

Su ejemplo debe ser: <% = render: partial => 'event',: collection => @ events.sort {| a, b | segundo.event_at <=> a.event_at}%> – Yannis

8

Usted sólo puede revertir la colección ordenada:

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

, pero como dice Yannis, es mejor que ordene las cosas de la base de datos de manera ideal.

+0

Esto lo hizo funcionar. Pero quiero probar los otros ejemplos para aprender. –

10

En Rails 3 La sintaxis correcta es:

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

Usted puede hacer esto mediante el uso de desc método con el parámetro.

Véase más adelante ejemplo

@events.desc(:event_at) 

Esto le dará @events en orden descendente de event_at campo.

Gracias.

Cuestiones relacionadas