2009-09-18 9 views
11

Ruby a une méthode sort_by sur Enumerables. Fantastique! Donc, vous pouvez faire quelque chose commeruby ​​sort_by deux fois

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

Cela trierait un tas d'entrées par leurs noms de projet. Comment pourriez-vous faire en sorte que, dans les projets portant le même nom, les entrées soient triées en fonction de l'heure?

Répondre

24

Je suggère de placer la colonne que vous voulez trier dans un tableau.

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

Ceci respectera l'ordre de tri naturel pour chaque type.

+0

Si vous souhaitez que le tri secondaire soit le plus récent en premier, procédez comme suit: 'now = Time.now; entries.sort_by {| e | e.project.name, maintenant - e.project.time} ' –

+5

entries.sort_by {| e | e.project.name, -e.project.time} est plus logique. –

+0

Pas mal Antti, pas mal du tout! –

6

Vous pouvez utiliser la méthode de tri standard pour le faire.

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

le non nul? La méthode peut être utile ici: trier {| a, b | (a.projet.nom <=> b.projet.nom) .nonzero? ou (a.project.time <=> b.project.time)} –

3

Retour un tableau:

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

cela fonctionne parce que l'opérateur <=> sur les tableaux fait un champ par champ comparaison « lexical » qui est ce que vous cherchez.