2009-09-18 12 views
11

Ruby tiene un método sort_by en Enumerables. ¡Fantástico! Entonces puede hacer algo comoruby ​​sort_by twice

entries.sort_by { |l| l.project.name } 

Eso ordenaría un grupo de entradas por sus nombres de proyecto. ¿Cómo podría trabajar para que en los proyectos que tenían el mismo nombre, las entradas se clasificaran según su tiempo?

Respuesta

24

Yo sugeriría poner la columna que desea ordenar en una matriz.

entries.sort_by { |l| [l.project.name, l.project.time] } 

Esto respetará el orden natural para cada tipo.

+0

Si desea que la clasificación secundaria sea la más reciente, primero, haga esto: 'now = Time.now; entries.sort_by {| e | e.project.name, now - e.project.time} ' –

+5

entries.sort_by {| e | e.project.name, -e.project.time} tiene más sentido. –

+0

No está mal Antti, ¡nada mal! –

6

Puede usar el método de ordenación regular para hacerlo.

entries.sort do |a, b| 
    comp = a.project.name <=> b.project.name 
    comp.zero? ? (a.project.time <=> b.project.time) : comp 
end 
+3

el nonzero? método puede ser útil aquí: ordenar {| a, b | (a.project.name <=> b.project.name) .nonzero? o (a.project.time <=> b.project.time)} –

3

devolver una matriz:

entries.sort_by { |l| [ l.project.name, l.project.time] } 

esto funciona porque el operador <=> en matrices hace un campo por campo de comparación 'léxico' que es lo que está buscando.