2009-08-14 5 views

Respuesta

105

Ruby incluye soporte para ordenar la caja.

sorted = @records.sort_by &:created_at 

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

+2

Enumerable # sort_by es ideal para este tipo de cosas, mucho mejor que el otro ejemplo con el tipo Enumerable #. – tadman

+1

gracias por la aclaración. Tengo varios "puntos de entrada" para la misma vista, y las consultas pueden tener o no los mismos patrones de clasificación (lo sé, no es lo ideal). ¿Pero no es el orden en el que se mostrarán las listas de cosas, no necesariamente una función de "solo controlador"? – user94154

+1

tadman - cuidado para elaborar? Según mi entendimiento de los documentos de api, sort_by es la forma más lenta y flexible de hacer una especie. Ideal para géneros más complejos, pero demasiado para algo tan simple. –

24

Sólo tiene que llamar especie en la colección, que pasa en el bloque de código que le dice a Rubí cómo quiere que para ordenar:

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

muchas gracias por la respuesta rápida – user94154

+2

Esto es demasiado ineficiente en comparación con '.sort_by' en este caso. Por favor, compruebe la otra respuesta por Chuck. – Dogbert

+6

Para el registro, esto no será menos eficiente que la versión que di. – Chuck

25

Mientras Rubí Enumerable es impresionante, las consultas de ActiveRecord en realidad devuelve un ActiveRecord :: Relation cuya consulta no se habrá evaluado aún (Carga diferida) y puede hacer que el método de pedido solicite que descargue este procesamiento a la base de datos donde escalará mucho mejor que una estrategia basada en Enumerable.

Usar Enumerable para ordenar también confunde la 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) 
1

favor botín en éste y también comprobar complejidades.

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

#versus 

Model.order(“created_at DESC”) #=> O(1) 
0

La mejor manera de Ordenamiento de una matriz ActiveRecord está utilizando fin método predeterminado

@ users.order (: created_at)

Es la más rápida y la solución más correcta, ya que en ese caso devuelve array ordenado desde db y no necesita usar ninguna otra operación para eso en la clase; por ejemplo, si usa el sort_by sugerido, lanzará cada elemento del conjunto y luego no será un conjunto ActiveRecord no genial en mi opinión.

order se pueden utilizar cadenas y sumbols, es muy útil, y se tarda varios parámetros

@ users.order ('asc created_at, nombre apellido desc asc apellido')

Cuestiones relacionadas