Ruby on rails 如何在相关模型上使用地理编码器按距离对记录数组进行排序?
Im在Rails 4上使用地理编码器处理位置 我有两个型号的列表和位置 列表Ruby on rails 如何在相关模型上使用地理编码器按距离对记录数组进行排序?,ruby-on-rails,rails-geocoder,Ruby On Rails,Rails Geocoder,Im在Rails 4上使用地理编码器处理位置 我有两个型号的列表和位置 列表 class Listing < ActiveRecord::Base has_many :locations end 我希望返回的结果按搜索城市的距离排序。搜索时,返回的结果按列表ID排序 我能做到这一点的唯一方法就是这样做@listings变量 def index @query = Geocoder.search(params[:q]).first @location = Location
class Listing < ActiveRecord::Base
has_many :locations
end
我希望返回的结果按搜索城市的距离排序。搜索时,返回的结果按列表ID排序
我能做到这一点的唯一方法就是这样做@listings变量
def index
@query = Geocoder.search(params[:q]).first
@location = Location.near(@query.address, 50).order("distance")
@listings = []
@location.each do |l|
@listings.push(Listing.find(l))
end
end
但是这运行了大量的数据库查询,我担心有大量的记录和搜索,会给数据库带来很大的压力
有没有一种更简洁的方法可以让数组按我想要的方式排序?谢谢
ActiveRecord.find
接受一个数组,在这种情况下执行单个查询。因此,如果您可以为单个位置执行列表。查找,则对整个阵列执行此操作同样容易:
def index
@query = Geocoder.search(params[:q]).first
@location = Location.near(@query.address, 50).order("distance")
@listings = Listing.find(@location)
end
然后应该执行三个查询:地理编码器搜索、位置查询,然后是单一列表查询
(此时我不会再麻烦优化它了。)所以我想出了一个更好的方法来排序我的列表数组
@listings = Listing.find(@location.map(&:listing_id)).sort_by{|listing| listing.locations.first.distance_to(@query.address)}
我可能会遇到问题,当我在未来添加每个列表都有多个位置的功能时,但这一功能现在起作用,我会跨越这一桥梁,我来了,感谢您的回复,但当我提出您的建议时,我会出现“无法访问位置”错误。我不确切知道这些类,也许不必使用@location
试试@location.to_a
。不确定这是否能满足您的需求。如果@location
包含ID为[1,3,4,12]的位置记录,则列出。find(@location)
将返回带有这些ID(即[1,3,4,12])的列表记录,而不是属于位置记录[1,3,4,12]的记录。
def index
@query = Geocoder.search(params[:q]).first
@location = Location.near(@query.address, 50).order("distance")
@listings = Listing.find(@location)
end
@listings = Listing.find(@location.map(&:listing_id)).sort_by{|listing| listing.locations.first.distance_to(@query.address)}