2015-11-03 53 views
2

我不確定如何詞這是我不知道這個正確的術語是什麼,但..收集通過其他型號軌道4

我有一個用戶模型。這個模型可以創建列車。這樣user.trains有他們所有的火車。這個模型也可以創建總線,這樣user.buses擁有所有的總線。火車和巴士都可以包含貨物。 user.trains.cargo和user.buses.cargo。

我該如何設置,以便我可以請求User.cargo並從列車和公共汽車上獲取所有貨物,而無需爲每個貨物調用.cargo列表?

回答

2

單表繼承的答案可能你是偉大的,特別是如果火車和公共汽車大多已對他們相同的數據。但是,如果這些模型彼此非常不同,則可能需要不同的解決方案。

如果您在用戶類中定義了一個簡單的方法,該怎麼辦?

class User 
    has_many :trains 
    has_many :buses 

    def cargo 
    trains.map(&:cargo) + buses.map(&:cargo) 
    end 
end 

這個答案假定每個BusTrain有貨,這比你的例子顯示User.trains.cargo不同。

+0

許多偉大的答案在這裏,但是這是最接近於我實現了。謝謝 –

2

您可以在導軌中使用use the concept of Single Table inheritance

當你同時擁有TrainsBuses,兩者可以說是種一Vehicle的,你可以有一個基本模型Vehicle,並讓雙方TrainVehicle如下Bus繼承:

class Vehicle < ActiveRecord::Base; end 
class Train < Vehicle; end 
class Bus < Vehicle; end 

然後,您的User類可以有一個one-to-many關聯到CargoVehicle

像這樣,如果您致電user.cargoesuserUser的一個實例),則結果應該是指定用戶的所有貨物。

希望,這將引發對你的問題的一些輕......

+0

所有情況下,這沒有工作,我有問題,但偉大的答案 –

2

我還沒有嘗試過,但active_record_union似乎很有希望。

class User < ActiveRecord::Base 
    has_many :buses 
    has_many :trains 

    scope :cargoes, ->{buses.select(:cargo).union_all(trains.select(:cargo))} 
end