2009-09-18 31 views
11

Ruby ma metodę sort_by na Enumerables. Fantastyczny! Możesz więc zrobić coś takiego, jak:ruby ​​sort_by dwa razy

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

To by uporządkowało kilka wpisów według ich nazw projektów. Jak mogłeś pracować, aby w projektach o tej samej nazwie wpisy były sortowane według czasu?

Odpowiedz

24

Sugerowałbym umieszczenie kolumny, którą chcesz posortować, w tablicy.

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

Będzie to zgodne z kolejnością sortowania naturalnego dla każdego typu.

+0

Jeśli chcesz, aby sortowanie wtórne było najnowszym-pierwszym, wykonaj następujące czynności: 'now = Time.now; entries.sort_by {| e | e.project.name, teraz - e.project.time} ' –

+5

entries.sort_by {| e | e.project.name, -e.project.time} ma więcej sensu. –

+0

Niezły Antti, wcale nie taki zły! –

6

Możesz użyć zwykłej metody sortowania, aby to zrobić.

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

niezerowe? metoda może być pomocna tutaj: sort {| a, b | (a.project.name <=> b.project.name) .nonzero? lub (a.project.time <=> b.project.time)} –

3

zwraca tablicę:

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

to działa, ponieważ operator <=> na tablicach robi pole po polu „” leksykalnej porównaniu do czego szukasz.

Powiązane problemy