首页 > 解决方案 > Rails ActiveRecord - 按匹配号查询订单

问题描述

我有一个模型叫Location. 该表有 2 个我想排序的字段:(rating整数)和name(字符串)。

我想按名称的字母顺序排序,但如果评级是 5,我希望该评级排在第一位。如果评级是 5 以外的任何其他值,我希望它们在 5 之后按字母顺序公正地显示。

这可能与SQL有关吗?我知道我显然可以用 Ruby 的 Array#sort 来做到这一点,但我想把它作为一个查询来做。

标签: sqlruby-on-railsrubypostgresqlactiverecord

解决方案


是的,你可以用一点 SQL 来做到这一点。您需要case在 ORDER BY 中包含一个表达式:

case rating when 5 then 0 else 1 end

这大致相当于rating == 5 ? 0 : 1在 Ruby 中,因此它将所有评级为 5 的位置放在首位,其他位置放在后面。然后排序name

Location.order(Arel.sql('case rating when 5 then 0 else 1 end, name'))

当然,您可以将其隐藏在一个范围内,以使事情更易于阅读和理解。


推荐阅读