2009-09-18 14 views
11

RubyにはEnumerablesのsort_byメソッドがあります。素晴らしい!だからあなたは何かをすることができますruby​​ sort_by twice

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

それは、プロジェクト名でエントリの束を並べ替えるでしょう。どのようにして同じ名前のプロジェクト内でエントリを時間順に並べ替えることができますか?

答えて

24

並べ替えたい列を配列に入れることをお勧めします。

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

これは、各タイプの自然なソート順を尊重します。

+0

セカンダリソートを最も新しいものにしたい場合、これを実行します: '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} が理にかなっています。 –

+0

悪くないAntti、全く悪くない! –

6

通常の並べ替え方法を使用して行うことができます。

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

ゼロ以外の?メソッドはここで役立ちます:sort {| a、b | (a.project.name <=> b.project.name).nonzero?または(a.project.time <=> b.project.time)} –

3

戻り配列:

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

アレイ上<=>オペレータはあなたが探しているものであるフィールドごとの「字句」の比較を行うので、これは動作します。

関連する問題