【问题标题】:How to sort activerecord query by specific prority如何按特定优先级对活动记录查询进行排序
【发布时间】:2014-05-12 23:35:30
【问题描述】:

我正在使用 rails 3 和 postrges。

我想按特定优先级排序。

类似:

Assignment.order(priority: ['best', 'good', 'bad'])

这将首先返回所有活动记录,“最好”,然后是“好”,然后是“坏”

我似乎找不到这样的东西。我不需要数组,它必须是活动记录。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    订单可以是任何 SQL 代码。您可以使用CASE 语句将您的值映射到以正确顺序自然排序的值。

    Assignment.order("
        CASE
          WHEN priority = 'best' THEN '1'
          WHEN priority = 'good' THEN '2'
          WHEN priority = 'bad' THEN '3'
        END")
    

    更好的是,您可以将此逻辑移动到模型中,以便更容易从控制器调用:

    class Assignment < ActiveRecord::Base
      ...
      def self.priority_order
        order("
            CASE
              WHEN priority = 'best' THEN '1'
              WHEN priority = 'good' THEN '2'
              WHEN priority = 'bad' THEN '3'
            END")
      end
    end
    

    然后您只需致电Assignment.priority_order 即可获取您的排序记录。

    如果该列在视图中是可排序的,则在方法中添加一个参数用于方向:

    def self.priority_order(direction = "ASC")
      # Prevent injection by making sure the direction is either ASC or DESC
      direction = "ASC" unless direction.upcase.match(/\ADESC\Z/)
      order("
          CASE
            WHEN priority = 'best' THEN '1'
            WHEN priority = 'good' THEN '2'
            WHEN priority = 'bad' THEN '3'
          END #{direction}")
    end
    

    然后,您将调用 Assignment.priority_order(params[:direction]) 从控制器传递排序。

    【讨论】:

      【解决方案2】:

      在较新版本的 Rails 中,如果您将原始 SQL 传递给 .order(),您将收到 ActiveRecord::UnknownAttributeReference (Query method called with non-attribute argument(s) 错误。

      您需要使用Arel.sql() 包装您的SQL 查询。您还可以使用 ruby​​ 的 Here Doucment 语法编写多行 SQL 语句,并使用 squish 使其在控制台中更具可读性。

      所以整个事情变成了:

      Assignment.order(
        Arel.sql(<<-SQL.squish
          CASE
            WHEN priority = 'best' THEN '1'
            WHEN priority = 'good' THEN '2'
            WHEN priority = 'bad' THEN '3'
          END
        SQL
        )
      )
      

      【讨论】:

        猜你喜欢
        • 2019-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        相关资源
        最近更新 更多