Ruby on rails 按反向和非反向组合的多字段排序

Ruby on rails 按反向和非反向组合的多字段排序,ruby-on-rails,ruby,api,ruby-on-rails-5,Ruby On Rails,Ruby,Api,Ruby On Rails 5,所以我从数据库中得到了这个对象数组,我必须按顺序对它进行排序: 按比分倒转 按倒计时 按姓名 我已经尝试了所有三个反向,但我需要的是最后一个不应该是反向描述这是我的代码: new_data = data.sort_by{ |t| [t.score, t.matches_count, t.name] }.reverse 结果 预期结果应按ASC顺序按名称排序,而不是按描述。我知道我的代码是错误的,因为t.name在里面。相反,如果我在前2个之后单独按名称重新排序,我将得到错误的答案,它将只

所以我从数据库中得到了这个对象数组,我必须按顺序对它进行排序:

按比分倒转 按倒计时 按姓名 我已经尝试了所有三个反向,但我需要的是最后一个不应该是反向描述这是我的代码:


new_data = data.sort_by{ |t| [t.score, t.matches_count, t.name] }.reverse


结果

预期结果应按ASC顺序按名称排序,而不是按描述。我知道我的代码是错误的,因为t.name在里面。相反,如果我在前2个之后单独按名称重新排序,我将得到错误的答案,它将只按名称排序,而不是按3排序。我也尝试过从查询中删除.ordername DESC,所以当反向时,它将变为ASC,但运气不好。谢谢大家!

data = [{:score=>100.0, :matches_count=>2, :name=>"DAV"},
        {:score=>100.0, :matches_count=>1, :name=>"SAN"},
        {:score=>100.0, :matches_count=>1, :name=>"PAS"},
        {:score=>110.0, :matches_count=>1, :name=>"PAR"},
        {:score=>100.0, :matches_count=>1, :name=>"NUE"}] 
您还可以使用,它不要求按降序排序的值是数字,只要它们是可比较的,也就是说,只要它们响应方法:

除了使用-还可以尝试使用反向排序!如下所示:

因此,在您的情况下,您可以:

new_data = data.sort_by{ |t| [!t.score, !t.matches_count, t.name] }

这将为您提供与预期相同的结果。

@noname是的,我已经尝试过了,正如您在我问题的最后部分所看到的,它将单独按名称返回数据,而不是先按分数,然后再按名称匹配。非常感谢。我只是注意到了这一点,所以我删除了评论。我没有想到使用-而不是。反转我之前尝试的是数据。按{t|t |[t.score.reverse,t.matches_count.reverse,t.name]}排序,这就是为什么它返回未定义的方法`reverse',非常感谢!
data.sort_by{ |h| [-h[:score], -h[:matches_count], h[:name]] }
  #=> [{:score=>110.0, :matches_count=>1, :name=>"PAR"},
  #    {:score=>100.0, :matches_count=>2, :name=>"DAV"},
  #    {:score=>100.0, :matches_count=>1, :name=>"NUE"},
  #    {:score=>100.0, :matches_count=>1, :name=>"PAS"},
  #    {:score=>100.0, :matches_count=>1, :name=>"SAN"}] 
data.sort do |t1, t2|
  case t1[:score] <=> t2[:score]
  when -1
     1
  when  1
    -1
  else
    case t1[:matches_count] <=> t2[:matches_count]
    when -1
       1
    when  1
      -1
    else
      t1[:name] <=> t2[:name]
    end
  end
end
  #=> <as above>
new_data = data.sort_by{ |t| [!t.score, !t.matches_count, t.name] }