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) 

好運。