ハッシュの配列を複数のキーでソートする

中国から閲覧できないので転載:出典は
http://rails3try.blogspot.com/2011/12/ruby.html

[ruby] ハッシュの配列を複数のキーでソートする
実行環境:
ruby 1.9.3
rubyでハッシュの配列を複数のキーでソートする場合のやり方です。
多次元配列やオブジェクトの配列も同じ考え方でいけます。
※一次元の単純な配列には値の系列が1つしかありませんので関係ありません。

たとえば、以下のようなハッシュの配列があったとします。

arr = [ { :name => "Dave", :age => 7, :birthday => '12/05' },
{ :name => "Carol", :age => 5, :birthday => '08/23' },
{ :name => "Alice", :age => 6, :birthday => '05/18' },
{ :name => "Bob", :age => 5, :birthday => '01/31' } ]


これを :age と :birthday の2つの値でソートしたいと思います。

まずは基本。:ageの値をキーとしてソートするなら

arr.sort!{ |a, b| a[:age] <=> b[:age] }

こんな感じですよね。

次に :age と :birthday の2つの値をキーでソートします。
言いかえれば、まず :age の値で比べて :age が同じなら :birthday の順で並び変える、ということです。
あくまでも例なので :birthday に年まで入れろや、という突っ込みはなしで(^^;

arr.sort!{ |a, b| (a[:age] == b[:age]) ? a[:birthday] <=> b[:birthday] : a[:age] <=> b[:age] }

こんな感じでしょうか。
:age の値の比較を2回やっているのがちょっとカッコ悪いですかね。