繁体   English   中英

如何在关联模型上使用Geocoder按距离对记录数组进行排序?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM