Classificar objetos por N critérios

Ok, imagine que você precisa classificar um array de objetos por N critérios.

Aqui está sua matriz:

array = [{a: 2, b: 2}, {a: 2, b: 1}, {a: 1, b: 2}, {a: 1, b: 2}]

Aqui está a lista de critérios:

criteria = [:a, :b]

E aqui está como classificá-lo:

array.sort! do |a,b| 
criteria
.reverse_each.inject(true) do |m, s|
m
&& a[s] <=> b[s]
end
end

E o resultado é

[{:a=>1, :b=>1}, {:a=>1, :b=>2}, {:a=>2, :b=>1}, {:a=>2, :b=>2}]

Felicidades!