2013-03-10 49 views
4

我有3個表格:ObjectsLocationsHotels在給定半徑內搜索相應物體位置的酒店(Gem Geocoder)

每個對象有幾個位置,並且每個位置都有幾個酒店(在缺省情況下20英里半徑)。

我的模型(一點點簡化它專注於主要的東西)

object.rb

attr_accessible :name 

has_many :locations 
has_many :hotels 

location.rb

attr_accessible :name, :address, :longitude, :latitude 

has_many :objects 
has_many :hotels 

酒店。 rb

attr_accessible :name, :address, :longitude, :latitude 

has_many :objects 
has_many :locations 

我想創建一個搜索表單,其中用戶將能夠輸入對象的,並搜索半徑

輸出應所有的賓館,分別位於從每個位置,其對應於物體的中心的給定半徑(小於或等於20英里)內的列表。

我想使用Geocoder's寶石方法near,但我不知道如何構建這樣的任務的控制器層。

enter image description here

+0

無關側面說明:什麼工具(S)用於生產上述實體關係圖? – 2013-03-10 23:19:09

+0

我只用了Keynote。我通常繪製每個結構以更好地理解 – 2013-03-10 23:47:04

+0

謝謝。我不確定它看起來不熟悉。工作很好。 – 2013-03-11 00:09:04

回答

3

你想要的空間查詢引擎在你的數據庫做這些查詢,例如MongoDB或PostGIS(在Postgres中)。我認爲你要找的答案會因你使用的答案而異。我使用PostGIS來處理這些東西,並且非常喜歡它。

這就是說,地理編碼器可用於沒有空間查詢引擎內部動力這一點,雖然這將是不那麼有效。如果你真的變大了,它會停下來。如果你看看源:https://github.com/alexreisner/geocoder/blob/master/lib/geocoder/stores/active_record.rb

# skeleton for the controller method 
obj = Object.find(name) 
locations = obj.locations 
near_hotels = locations.map do |loc| 
    locations.hotels.near([loc.latitude, loc.longitude]) 
end 

不知道不久的方法妥善需要一個半徑參數,但你可以通過基本上覆制它寫自己很容易:

# on the hotel class 
def nearby(lat, lon, radius) 
    options = self.send(:near_scope_options, lat, lon, radius, {}) 
    select(options[:select]).where(options[:conditions]). 
     order(options[:order]) 
} 

我強烈建議你檢查PostGIS。

注意,我的例子方法產生的關係。您可以縮小範圍,選擇適合您的物體的酒店。

+0

我知道我做得很晚,但我檢查了Postgis,它非常好。 – 2013-07-17 13:58:50