2011-10-18 59 views
0

我有一個巴士模型和事件模型。每輛巴士都要參加活動:我該如何構建這個複雜的ActiveRecord查詢?

class Bus < ActiveRecord::Base 
    belongs_to :event 
    belongs_to :origin 
end 

class Event < ActiveRecord::Base 
    has_many :buses 
end 

正如你所看到的,每輛公共汽車都有一個起點(它離開的地方)。起源可能有許多巴士離開它。起源在創建時進行地理編碼(由[Geocoder gem][1]),以便它們具有與它們相關的經度和緯度。

class Origin < ActiveRecord::Base 
    has_many :buses 
    geocoded_by :full_address 

    def full_address 
    # returns the full address of the origin 
    end 
end 

地理編碼而且提供了他們一個near範圍,這樣我可以搜索Origin.near([lat, long])

所以,我想要做的是找到總線這是去@event,並且它的起源最接近[@lat, @long]

事情是這樣的:

Bus.where(:event_id => @event.id) 
    .joins(:origin) 
    .near([@lat, @long]) 
    .first 

不過,當然,這錯誤,因爲Bus.where.joins返回ActiveRecord::Relation,但near範圍上Origin類。

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

任何想法?

編輯:
它只是發生在我身上,我可以添加has_many :through協會EventOrigin。不知道這是否有幫助?

回答

-1

我認爲加入是沒有意義的!你爲什麼不這樣做?

@event.buses.each do |bus| 
     bus.origin.near([@lat, @long]) 
     _do sth,..._ 
end 

因爲起源已經與巴士相關聯,並且您已經有@event。

+1

我想保持一切與ActiveRecord關係和範圍工作。據我瞭解,如果一個事件有6000個公交車到達(與我相伴一秒),軌道會將它們全部加載到內存中並遍歷其中的每一個。 Afaik有更好的辦法。 –