0

我使用此代码来获取我的网站上给定距离内的所有广告。我有两个模型,广告和位置。每个广告都有一个位置。我对每个位置的地址字段进行地理编码,以查找位于用户搜索范围内的地址字段。附近地理位置的地理编码使用了太多的Google地图查询

此代码可能需要重构,但我设法得到它做什么,我需要它;当用户搜索地址时,会显示特定距离内的所有广告。

的问题是代码执行的每一个广告查询,并与我的数据库1000页的广告,这很快越过谷歌地图的限制。我有用户可以点击的按钮来改变搜索距离,每次点击都会对每个广告进行查询。有没有另外一种方法可以编码,这将不需要太多的查询?

#find ads with locations in range of user address search 
    ads_within_distance = Ad.select { |ad| ad.location.distance_from(cookies[:search_address]) <= distance.to_f } 

    ads_within_distance.each do |ad| 
     nearby_ads_id_array = ad.id 
    end 

    @nearby_ads = Ads.where(id: nearby_ads_id_array).paginate(:page => params[:page], :per_page => 5).order('created_at DESC') 

这显然可以做到,因为像meetup.com这样的许多网站都有这个功能。我愿意使用任何最有效的方法。我真的很感激任何意见。

回答

2

你的方法有两个问题。我假设一个位置可以有很多广告。如果是这种情况,则您的关联应为:

class Location < ActiveRecord::Base 
    has_many :ads 
    ... 
end 

class Ad < ActiveRecord::Base 
    belongs_to :location 
    ... 
end 

由于您正在迭代广告,因此您可能会多次检查相同位置的距离。

其次,由于您传递的是地址,因此即使您只有一个地址,而您没有经纬度(用户输入的地址),也需要为每个广告进行地理编码。我假设您在数据库中的位置已经进行了地理编码,并且每个地方都有一个经纬度。

如果您使用的是地理编码宝石(https://github.com/alexreisner/geocoder),你可以写:

nearby_locations = Location.near(cookies[:search_address], distance.to_f) 

然后你就可以找到它通过属于那些位置上的所有信息

nearby_ads = Ad.where(location_id: nearby_locations) 

好运。