Ordenar array devuelto por ActiveRecord por fecha (o cualquier otra columna)


¿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.

Por favor, no me digas que lo haga en la consulta porque necesito que esto suceda en la vista.

Author: Arslan Ali, 2009-08-14

5 answers

Ruby incluye soporte para ordenar fuera 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.

 109
Author: Chuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-14 15:29:53

Mientras que Ruby Enumerable es impresionante, las consultas ActiveRecord realmente devolverán una relación ActiveRecord::cuya consulta no habrá sido evaluada todavía (Lazy Loading) y puede tener el método order llamado para descargar este procesamiento a la base de datos donde 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 del orden sea aplicado en la vista. Sin embargo, tendería a poner esto en el alcance del modelo.

sorted = @records.order(:created_at)
 25
Author: shulmang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-28 16:08:54

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

collection.sort { |a,b| a.created_at <=> b.created_at }
 24
Author: Bill D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-28 16:09:22

Por favor, mira este y también comprueba las complejidades.

Model.all.sort_by{|m| m.created_at} #=> O(log n)

#versus

Model.order(“created_at DESC”) #=> O(1)
 1
Author: Sajjad Murtaza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-01 09:40:52

La mejor manera de ordenar la matriz ActiveRecord es utilizando el método predeterminado order

@usuarios.order (: created_at)

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

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

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

 0
Author: Dmitriy Gusev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-10 09:15:24