有馬です。

なんとなく既視観を覚えたので捜索したところ、同じような意図のメソッドを使ってました。
sort_by に与えられるブロックの評価結果が Comparable である必要があります。

module Enumerable
  def sort_by(&block)
    sort { |a, b| (yield a) <=> (yield b) }
  end
  def sort_by!(&block)
    replace sort_by(&block)
  end
end

p  ary = [4,333,55,44,3]
p  ary.sort
p  ary.sort { |a, b| a <=> b }
p  ary.sort_by { |i| i }
p  ary.sort_by { |i| i.to_s }
p  ary.sort_by { rand(0) }   # shuffle ^_^

p  ary = [["a", 4], ["b", 333], ["c", 55], ["d", 44], ["e", 3]]
p  ary.sort_by { |e| e[1] }
p  ary.sort_by { |e| e[1].to_s }

p  ary = ["ruby", "Ruby", "Perl", "perl", "Python", "python"]
p  ary.sort_by { |s| s.downcase }

--
 有馬 康弘 <fit0298 / fitec.co.jp>