[英]How do I sort an array of records by distance using geocoder on an associated model?
Im在Rails 4上使用地理编码器处理位置。
我有两个模型清单和位置
清单
class Listing < ActiveRecord::Base
has_many :locations
end
位置
class Location < ActiveRecord::Base
belongs_to :listing
geocoded_by :full_address
after_validation :geocode
def full_address
[street, city, state, country].compact.join(", ")
end
end
我试图创建一个简单的搜索功能,在该功能中,用户输入城市并返回到搜索查询50英里内的列表清单。
我的列表控制器索引操作中处理了搜索功能
def index
@query = Geocoder.search(params[:q]).first
@location = Location.near(@query.address, 50).order("distance")
@listings = Listing.find(@location.map(&:listing_id))
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
一个数组,在这种情况下执行单个查询。 因此,如果您可以为单个位置执行Listing.find
,那么对整个数组进行操作就一样简单:
def index
@query = Geocoder.search(params[:q]).first
@location = Location.near(@query.address, 50).order("distance")
@listings = Listing.find(@location)
end
然后应该执行三个查询:Geocoder搜索,Location查询,然后是单个Listing查询。
(我现在不会再对其进行优化了。)
所以我想出了一种更好的方式对我的Listing数组进行排序。
@listings = Listing.find(@location.map(&:listing_id)).sort_by{|listing| listing.locations.first.distance_to(@query.address)}
当我增加将来在每个列表中拥有多个位置的功能时,我可能会在将来遇到问题,但是此操作现在可行,我会越过这个桥梁,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.