sort_by sort rails descending created_at column all ruby-on-rails ruby arrays activerecord

ruby-on-rails - rails - ruby sort_by descending



Sort array devuelto por ActiveRecord por fecha(o cualquier otra columna) (5)

¿Cómo puedo ordenar una matriz devuelta por una consulta ActiveRecord por una columna de fecha created_at ?

Esto ocurre una vez que se ha ejecutado la consulta.

No me digas que lo haga en la consulta porque necesito que esto suceda en la vista.


La mejor manera de ordenar el arreglo ActiveRecord es usando el orden de método predeterminado

@ users.order (: created_at)

Es la solución más rápida y correcta, porque en ese caso devuelve matriz ordenada desde db y no necesita usar ninguna otra operación para eso en la clase, por ejemplo, si usa sort_by sugerido lanzará cada elemento de matriz en bucle , y después de eso no será una matriz ActiveRecord, no genial en mi opinión.

order puede usar cadenas y sumbolos, es muy útil y toma múltiples parámetros

@ users.order (''created_at asc, first_name desc, last_name asc'')


Mientras que Ruby Enumerable es impresionante, las consultas de ActiveRecord realmente devolverán una ActiveRecord :: Relation cuya consulta aún no se habrá evaluado (Lazy Loading) y puede hacer que el método de pedido invoque la descarga de este procesamiento a la base de datos donde se escalará mucho mejor que una estrategia basada en Enumerable .

Usar Enumerable para ordenar también confunde hacer paginación en la base de datos. No hay nada que impida que la estrategia de orden se aplique en la vista. Sin embargo, tendería a poner esto en el alcance del modelo.

sorted = @records.order(:created_at)


Por favor, saquee este y también verifique las complejidades.

Model.all.sort_by{|m| m.created_at} #=> O(log n) #versus Model.order(“created_at DESC”) #=> O(1)


Ruby incluye soporte para ordenarlo de la caja.

sorted = @records.sort_by &:created_at

Sin embargo, esto no parece tener mucho que ver con la pantalla y probablemente pertenece al controlador.


Solo llame a sort en la colección, pasando el bloque de código que le dice a Ruby cómo desea ordenarlo:

collection.sort { |a,b| a.created_at <=> b.created_at }