Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在相关模型上使用地理编码器按距离对记录数组进行排序?_Ruby On Rails_Rails Geocoder - Fatal编程技术网

Ruby on rails 如何在相关模型上使用地理编码器按距离对记录数组进行排序?

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

Im在Rails 4上使用地理编码器处理位置

我有两个型号的列表和位置

列表

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)}