通过其他模型收集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 

这个答案假定每辆 BusTrain都有货物,这与显示User.trains.cargo的示例不同。

您可以在rails中使用单表inheritance的概念 。

由于你有TrainsBuses ,两者都可以说是Vehicle类型,你可以有一个基本Vehicle ,让TrainBusVehicleinheritance如下:

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

然后,您的User类可以与Cargo through Vehicle one-to-many关联。

像这样,如果你调用user.cargoesuseruser的实例),结果应该是指定用户的所有货物。

希望这能为你解决这个问题......

我没试过,但active_record_union看起来很有希望。

 class User < ActiveRecord::Base has_many :buses has_many :trains scope :cargoes, ->{buses.select(:cargo).union_all(trains.select(:cargo))} end