2014-11-20 34 views
0

Im on 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 

但這運行一堆數據庫查詢的和Im擔心有很多的記錄和搜索,數據庫會有很大的壓力。

是否有更簡潔的方式讓我按照自己想要的方式排列數組?謝謝。

回答

0

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 

那麼這應該做三個查詢:在地理編碼搜索,位置查詢,然後單清單查詢。

(我不會打擾在這一點上任何更多的優化它。)

+0

感謝您的迴應,但是當我提出您的建議時,我收到「無法訪問位置」錯誤。 – oobie11 2014-11-20 21:46:48

+0

我完全不知道這些類,可能不是'@ location'嘗試'@ location.to_a'。 – 2014-11-20 22:06:13

+0

不知道這會給你你想要的。如果'@ location'包含帶有id [1,3,4,12]的Location記錄'Listing.find(@location)'將返回帶有這些id的列表記錄(即[1,3,4,12]),而不是記錄屬於位置記錄[1,3,4,12]。 – 2017-04-19 19:55:24

0

於是我想出了一個更好的方式來排序我的清單陣列。

 @listings = Listing.find(@location.map(&:listing_id)).sort_by{|listing| listing.locations.first.distance_to(@query.address)} 

林可能會碰上時,我加入到在未來每個上市的多個位置的能力,未來的問題,但這個工程現在和不適到橋頭文我來了,