Ruby on rails 按Rails中的临时列字段排序ActiveRecord关系
我需要在Ruby on rails 按Rails中的临时列字段排序ActiveRecord关系,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,我需要在ActiveRecord::Relation对象中,通过运行时计算的值,对Profile项进行查询 我已使用attr\u访问器在我的控制器中为关系对象创建并分配了一个临时列distance,如下所示: @profiles.each do |p| p.class_eval do attr_accessor :distance end end @profiles.each do |p| p.distance = distance_arr[@profiles.index(p
ActiveRecord::Relation
对象中,通过运行时计算的值,对Profile
项进行查询
我已使用attr\u访问器在我的控制器中为关系对象创建并分配了一个临时列distance
,如下所示:
@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
但是,当我尝试使用order方法对关系进行排序时,我得到一个没有这样的列:distance
错误,即它没有拾取临时字段
下面是我如何在我的控制器中订购它的(注意,我使用的是将分页gem,但这与此无关)
您已将“距离”属性添加到纵断面实例中。所以距离的东西都在ruby中,sql对此一无所知。因为您是在用ruby计算距离,所以需要用ruby对它们进行排序。您可以使用sort_by方法
@profiles.sort_by{|p| p.distance}
或者,您可以将距离计算推送到sql中。类似于下面的内容
@profiles = Profile.select('*, 10 as distance').order('distance')
在这里,您可以看到计算距离列已添加到select中,它告诉active record更改查询。非常有效,谢谢!sort_by方法非常有效,谢谢!另一方面,为了使用数组对象获得will\u paginate
,我必须添加一个require语句
@profiles = Profile.select('*, 10 as distance').order('distance')