通过其他模型收集Rails 4
我不确定如何说这个,因为我不确定这个词的正确用语是什么,但是……
我有一个用户模型。 这个模型可以创建火车。 这样user.trains拥有他们所有的火车。 这个模型也可以创建总线,这样user.buses就拥有了所有的总线。 火车和公共汽车都可以包含货物。 user.trains.cargo和user.buses.cargo。
我如何设置它以便我可以直接询问User.cargo并从火车和公共汽车获得所有货物,而无需为每个货物拨打.cargo列表?
单表inheritance答案可能对您很有帮助,特别是如果Trains和Buses大部分都有相同的数据。 但是,如果这些模型彼此非常不同,您可能需要不同的解决方案。
如果您在用户类上定义了一个简单方法,该怎么办?
class User has_many :trains has_many :buses def cargo trains.map(&:cargo) + buses.map(&:cargo) end end
这个答案假定每辆 Bus
和Train
都有货物,这与显示User.trains.cargo
的示例不同。
您可以在rails中使用单表inheritance的概念 。
由于你有Trains
和Buses
,两者都可以说是Vehicle
类型,你可以有一个基本Vehicle
,让Train
和Bus
从Vehicle
inheritance如下:
class Vehicle < ActiveRecord::Base; end class Train < Vehicle; end class Bus < Vehicle; end
然后,您的User
类可以与Cargo
through Vehicle
one-to-many
关联。
像这样,如果你调用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