Еще одно решение для sort_by
в обратном порядке (-
работает не во всех случаях, подумайте, сортировка по строке):
class Invertible
include Comparable
attr_reader :x
def initialize(x)
@x = x
end
def <=> (x)
x.x <=> @x
end
end
class Object
def invertible
Invertible.new(self)
end
end
[1, 2, 3].sort_by(&:invertible) #=> [3, 2, 1]
["a", "b", "c"].sort_by(&:invertible) #=> ["c", "b", "a"]
Это медленнее, чем в простом случае, но можетлучше работать со сложными сортами:
objs.sort_by do |obj|
[obj.name, obj.date.invertible, obj.score, ...]
end