Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails jQuery数据表,按定义/计算属性排序_Ruby On Rails_Datatables - Fatal编程技术网

Ruby on rails Rails jQuery数据表,按定义/计算属性排序

Ruby on rails Rails jQuery数据表,按定义/计算属性排序,ruby-on-rails,datatables,Ruby On Rails,Datatables,我有一个模型具有num\u likes和num\u 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不能正确地按此排序,因为它不在数据库中 我怎样才能按这个属

我有一个模型具有
num\u likes
num\u 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

虽然您可以从使用ActiveRecord的
order
方法切换到使用原生Ruby的
sort
方法,但让DB服务器来完成这项工作可能比Rails服务器更好

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

下面是我的方法。请注意,我假设您使用的是PostgreSQL server,我不知道这是否适用于您的特定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
请注意,要使其工作,您需要将order方法从使用散列语法更改为字符串语法,否则ActiveRecord将把查询转换为
orderbypages.(num\u likes/num\u views).
,这显然不起作用