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 }