ノンカフェインであなたにやさしい

Ruby,Rails,HTML,CSS,Reactなど

Rubyのmin_byで比較対象にnilがいるとArgumentErrorでコケる

Rubyの簡単なサンプル

arr = [
  { name: "hoge1", age: 10 }, 
  { name: "hoge2", age: 13 }, 
  { name: "hoge3", age: 15 }, 
  { name: "hoge4", age: nil }
]

arr.min_by{ |e| e[:age] }
=> ArgumentError (comparison of NilClass with 10 failed)

ブロックの戻り値に<=>で比較できないものが混じっていると例外ArgumentError min_by (Enumerable) - Rubyリファレンス

とのこと

解決法

nilの扱いによって対応が変わるかと思います

nilを最小値とする場合

nilがあれば取得、無ければmin_byで最小値を取得

arr.find { |e| e[:age].nil? } || arr.min_by { |e| e[:age] }
=> {:name=>"hoge4", :age=>nil}

nilを除外して最小値を取得する場合

rejectnilを除外してから、min_byで最小値を取得

arr.reject { |e| e[:age].nil? }.min_by { |e| e[:age] }
=> {:name=>"hoge1", :age=>10}