【问题标题】:Rails jQuery Datatables, order by defined/calculated attributeRails jQuery Datatables,按定义/计算属性排序
【发布时间】:2015-12-20 22:05:05
【问题描述】:

我有一个具有num_likesnum_views 属性的模型。

以下将用于订购它们

@models = Model.all ## this may not be "all" so I dont want to use scope
@models.order({'num_likes': 'desc'})

如果我定义了方法

def like_pct
    num_likes / num_views
end

然后 jQuery DT 没有正确排序,因为它不在数据库中。

我怎样才能按这个属性订购?

这是实际的控制器代码:

    @pages = some_filtered_pages_collection

    # Sort based on requested column
    params[:order].each do |i, order|
      column = order[:column]
      sort_column = params[:columns][column][:data] # This is the attr name being sorted
      sort_order = order[:dir] # asc or desc
      @pages = @pages.order([[sort_column, sort_order]].to_h)
    end

【问题讨论】:

    标签: ruby-on-rails datatables


    【解决方案1】:

    虽然您可以从使用 ActiveRecord 的 order 方法切换到使用原生 Ruby 的 sort 方法,但让 DB 服务器而不是 Rails 服务器来完成工作可能是一个更好的主意。

    由于你的like_pct方法只定义在Rails服务器和DB服务器中,显然我们无法使用该方法来完成。

    这就是我的处理方法。请注意,我在这里假设您使用的是 PostgreSQL 服务器,我不知道这是否适用于您的特定 SQL 方言。

    params[:order].each do |i, order|
          column = order[:column]
          sort_column = params[:columns][column][:data] # This is the attr name being sorted
          sort_column = '(num_likes / num_views)' if sort_column = 'like_pct'
          sort_order = order[:dir] # asc or desc
          @pages = @pages.order("#{sort_column} #{sort_order}")
        end
    

    请注意,要使其正常工作,您需要将排序方法从使用哈希语法更改为字符串语法,否则 ActiveRecord 会将查询转换为 ORDER BY pages.(num_likes / num_views)...,这显然不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 2015-03-12
      • 2015-05-16
      • 2013-12-15
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多