Ruby で nil が含まれている配列をソートする

さて、Ruby の配列でソートを行いたい場合、配列内に nil があるとうまくソートできないことがあります。

ary = ["homu", nil, "mado", nil, nil, "mami", "saya", nil]

# Error: comparison of String with nil failed (ArgumentError)
ary.sort

これは、『nil とその他の要素が比較できない』のでエラーになっています。

nil とそうでない要素を分けてソートする

こういう場合は Enumerable#partition を利用して『nil』と『それ以外』を分けてからソートするといい感じにできそうです。

ary = ["homu", nil, "mado", nil, nil, "mami", "saya", nil]

# #partition で nil とそうでない要素を分けてからソートする
p ary.partition(&:nil?).yield_self { |nils, ary|
    # nil は末尾に持っていく
    ary.sort + nils
}
# => ["homu", "mado", "mami", "saya", nil, nil, nil, nil]

これでだいぶスッキリとソートすることが出来ますね。
今回は #nil? を使って分けましたが、他にも present?blank?hoge? みたいなメソッドを利用してもいい感じにソートが制御できそうです。

参照