何番煎じか分かりませんが、ちょっと面白かったのでメモがてら書いてみます。
data = [
{flag: true, score: 30},
{flag: false, score: 20},
{flag: true, score: 10},
{flag: false, score: 40}
]
# こういうデータがある時、条件1: trueを上に、条件2: スコア順でソートしたい
data.sort_by { |item| [item[:flag], item[:score]] }
# => ArgumentError: comparison of Array with Array failed
# むむ? キーをflagだけにすると...
data.sort_by { |item| item[:flag] }
# => ArgumentError: comparison of TrueClass with false failed
# なるほど! TrueClassとFlaseClassで比較はできないよってことね
# ということは... これならいけそう
data.sort_by { |item| [item[:flag] ? 0 : 1, item[:score]] }
# => [{:flag=>true, :score=>10}, {:flag=>true, :score=>30}, {:flag=>false, :score=>20}, {:flag=>false, :score=>40}]
# 良さそう! だけどscoreは降順にしたいな。
data.sort_by { |item| [item[:flag] ? 0 : 1, -item[:score]] }
# => [{:flag=>true, :score=>30}, {:flag=>true, :score=>10}, {:flag=>false, :score=>40}, {:flag=>false, :score=>20}]
# 🎊
# 別解. こっちの方が好きっていう人もいそう
data.partition{|i| i[:flag] }.map{|unit| unit.sort_by {|i| -i[:score] }}.flatten
item[:flag] ? 0 : 1
がダサいなーと思いつつ妙案が浮かばなかったでござる。