Rails:活动查询按特定顺序按多个值排序?

4
我有一张表。
Roles(id int,,name vachar(50),role enum(CAD,CA,CM,CV ))

我希望按照特定顺序选择数据,并按特定顺序排列。 我的 active model 查询:role.order('role asc'),然后得到以下结果:
1 name1 CAD
2 name2 CA
3 name2 CM

但是我希望结果像这样:
1 name1 CAD
2 name2 CM
3 name2 CA

有人可以帮我吗? 先行致谢

1个回答

7

一个便携的解决方案是在ORDER BY中使用CASE语句作为内联映射:

query.order(%q(
  case role
  when 'CAD' then 1
  when 'CM'  then 2
  when 'CA'  then 3
  end
))

请记住,您可以按照任何想要的表达式进行ORDER BY,而在SQL中,CASE肯定是一种表达式。

Rails的新版本将要求您使用Arel.sql而不是原始字符串:

query.order(
  Arel.sql(
    %q(
      case role
      when 'CAD' then 1
      when 'CM'  then 2
      when 'CA'  then 3
      end
    )
  )
)

如果列表是动态的,您可以构建一个CASE表达式:

array = %w[CAD CM CA]
q     = connection.method(:quote) # Or ApplicationRecord.connection.method(:quote)
cases = array.each_with_index.map { |e, i| "when #{q[e]} then #{i}" }
query.order(Arel.sql("case role #{cases.join(' ')} end"))

所有的字符串操作都有些丑陋,但它是完全安全的,并且通常会在作用域中隐藏它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接