我不確定如何詞這是我不知道這個正確的術語是什麼,但..收集通過其他型號軌道4
我有一個用戶模型。這個模型可以創建列車。這樣user.trains有他們所有的火車。這個模型也可以創建總線,這樣user.buses擁有所有的總線。火車和巴士都可以包含貨物。 user.trains.cargo和user.buses.cargo。
我該如何設置,以便我可以請求User.cargo並從列車和公共汽車上獲取所有貨物,而無需爲每個貨物調用.cargo列表?
我不確定如何詞這是我不知道這個正確的術語是什麼,但..收集通過其他型號軌道4
我有一個用戶模型。這個模型可以創建列車。這樣user.trains有他們所有的火車。這個模型也可以創建總線,這樣user.buses擁有所有的總線。火車和巴士都可以包含貨物。 user.trains.cargo和user.buses.cargo。
我該如何設置,以便我可以請求User.cargo並從列車和公共汽車上獲取所有貨物,而無需爲每個貨物調用.cargo列表?
單表繼承的答案可能你是偉大的,特別是如果火車和公共汽車大多已對他們相同的數據。但是,如果這些模型彼此非常不同,則可能需要不同的解決方案。
如果您在用戶類中定義了一個簡單的方法,該怎麼辦?
class User
has_many :trains
has_many :buses
def cargo
trains.map(&:cargo) + buses.map(&:cargo)
end
end
這個答案假定每個Bus
和Train
有貨,這比你的例子顯示User.trains.cargo
不同。
您可以在導軌中使用use the concept of Single Table inheritance。
當你同時擁有Trains
和Buses
,兩者可以說是種一Vehicle
的,你可以有一個基本模型Vehicle
,並讓雙方Train
從Vehicle
如下Bus
繼承:
class Vehicle < ActiveRecord::Base; end
class Train < Vehicle; end
class Bus < Vehicle; end
然後,您的User
類可以有一個one-to-many
關聯到Cargo
到Vehicle
。
像這樣,如果您致電user.cargoes
(user
是User
的一個實例),則結果應該是指定用戶的所有貨物。
希望,這將引發對你的問題的一些輕......
所有情況下,這沒有工作,我有問題,但偉大的答案 –
我還沒有嘗試過,但active_record_union似乎很有希望。
class User < ActiveRecord::Base
has_many :buses
has_many :trains
scope :cargoes, ->{buses.select(:cargo).union_all(trains.select(:cargo))}
end
許多偉大的答案在這裏,但是這是最接近於我實現了。謝謝 –