2012-09-06 53 views
7

結合我有兩個相關的軌道模型Rails的內連接與地理編碼寶石

class Location < ActiveRecord::Base 
    has_many :rates 
    geocoded_by .... 
end 

class Rate < ActiveRecord::Base 
belongs_to :location 
end 

我使用的地理編碼器寶石 - http://www.rubygeocoder.com

我想找到與特定pair屬性都內的所有利率一定距離的用戶。

在SQL中,我會做一個內部的速率加入

SELECT * FROM rates INNER JOIN locations ON rates.location_id=locations.id; 

然後插入一個where條件上對屬性進行篩選,然後使用上所得到的表的地理編碼器的接近方法(近方法通過使用經度和緯度上的位置屬性),只選擇合適的距離

我怎樣才能在軌做到這一點中的行插入一個where條件在其中計算距離的查詢?我試圖

rates = Rate.joins(:locations) 

我得到

ActiveRecord::ConfigurationError: Association named 'locations' was not found; perhaps you misspelled it? 

我想這樣做

rates = Rate.joins(:locations).near(my_latitude, my_longitude, distance).where(:rates => {:pair => 'xxxx'}) 

,但我得到

undefined method `near' for #<ActiveRecord::Relation:0xa075ff8> 
+0

因爲它是一個belongs_to的,我想':locations'必須是單數。不知道這是否會起作用,但您可能需要重新排序您的方法調用。取決於創業板如何與ARel合作。 'Rate.near(my_latitude,my_longitude,距離)。加入(:位置)。凡(:率=> {:一對=> 'XXXX'})' – agmcleod

回答

2

我知道這是一個古老的一個,但仍沒有回答,無處:)

我遇到了同樣的問題,然後偶然發現了一點點信息deep down in the geocoder documentation,它說,爲了使外連接的工作(在軌與包括做),你應該使用加入與組合:選擇並這對我來說是這樣的(我需要在某個位置查找用戶的所有產品)。

所以從我的頭頂正好,這可能會在你的情況下工作:

rates = Location.near(my_latitude, my_longitude, distance, :select => "rates.*").joins(:locations).where(:rates => {:pair => 'xxxx'}) 

我希望這有助於。

+0

該溶液產生了很多問題:不能使用範圍,分音不工作,因爲Rails試圖渲染位置而不是速率等。 – collimarco

7
near = Location.near(location, radius) 
Rate.includes(:location).references(:location).merge(near) 

這是可鏈接的其他位置或速度作用域