【问题标题】:Rails Active query order by multiple values in specific order?Rails Active按特定顺序按多个值查询顺序?
【发布时间】:2013-10-04 04:05:03
【问题描述】:

我有一张桌子

Roles(id int,,name vachar(50),role enum(CAD,CA,CM,CV ))

我想选择按特定顺序按特定值排序的数据。 我的活动模型查询:role.order('role asc') 然后结果:

1 name1 CAD
2 name2 CA
3 name2 CM

但我想要这样的结果:

1 name1 CAD
2 name2 CM
3 name2 CA

谁能帮帮我? 提前致谢

【问题讨论】:

    标签: sql ruby-on-rails sql-order-by


    【解决方案1】:

    一种可移植的解决方案是在您的 ORDER BY 中使用 CASE 语句作为内联映射:

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

    请记住,您可以 ORDER BY 任何您想要的表达式,并且 CASE 肯定是 SQL 中的表达式。

    较新版本的 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"))
    

    所有的字符串操作都有点难看,但它非常安全,您通常会将其隐藏在作用域中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      相关资源
      最近更新 更多