Ruby - 使用动态键排序

Ser*_*lto 0 ruby arrays hash

我有一系列哈希:

array = [
    {
        id: 1,
        name: "A",
        points: 20,
        victories: 4,
        goals: 5,
    },
    {
        id: 1,
        name: "B",
        points: 20,
        victories: 4,
        goals: 8,
    },
    {
        id: 1,
        name: "C",
        points: 21,
        victories: 5,
        goals: 8,
    }
]
Run Code Online (Sandbox Code Playgroud)

要使用两个键对它们进行排序,我会:

array = array.group_by do |key| 
[key[:points], key[:goals]] 
end.sort_by(&:first).map(&:last)
Run Code Online (Sandbox Code Playgroud)

但是在我的程序中,sort标准存储在数据库中,我可以将它们存储在一个数组中,例如:["goals","victories"]["name","goals"].

如何使用dinamic键对数组进行排序?

我尝试了许多方法,没有这样的成功:

criterias_block = []
criterias.each do |criteria|
    criterias_block << "key[:#{criteria}]"
end

array = array.group_by do |key| 
    criterias_block 
end.sort_by(&:first).map(&:last)
Run Code Online (Sandbox Code Playgroud)

itd*_*ork 5

Array#sort 可以做到这一点

criteria = [:points, :goals]
array.sort_by { |entry|
  criteria.map { |c| entry[c] }
}

#=> [{:id=>1, :name=>"A", :points=>20, :victories=>4, :goals=>5},
#    {:id=>1, :name=>"B", :points=>20, :victories=>4, :goals=>8},
#    {:id=>1, :name=>"C", :points=>21, :victories=>5, :goals=>8}]
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为如果对数组进行排序[[1,2], [1,1], [2,3]],它会按第一个元素排序,使用任何下一个元素来断开关系