通过Rails中的临时列字段对ActiveRecord Relation进行排序

时间:2015-06-28 06:08:43

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

我需要通过在运行时计算的值来命令查询Profile对象中的ActiveRecord::Relation条目。

我已使用distanceRelation对象在控制器中创建并分配了一个临时列attr_accessor,如下所示:

@profiles.each do |p|
  p.class_eval do
   attr_accessor :distance
  end
end

@profiles.each do |p|
  p.distance = distance_arr[@profiles.index(p)]  # Distance values obtained from an instance array
end

但是,当我尝试使用订购方法订购Relation时,我收到no such column: distance错误,即它没有取回临时字段。

以下是我尝试在控制器中订购的方式(请注意我使用will_paginate gem,但这是无关紧要的。)

@profiles = @profiles.order('distance ASC').paginate(page: params[:page])

1 个答案:

答案 0 :(得分:2)

您已将距离属性添加到配置文件实例。所以距离的东西都是红宝石,而sql对此一无所知。由于你在计算红宝石的距离,你需要在红宝石中订购它们。您可以使用sort_by方法。

@profiles.sort_by{|p| p.distance}

或者你可以将距离计算推送到sql中。类似于以下内容

@profiles = Profile.select('*, 10 as distance').order('distance')

在这里,您可以看到计算距离列已添加到选择中,该列告知活动记录更改查询。