Ruby on rails 通过其他型号的Rails 4进行收集
我不知道该怎么用这个词,因为我不确定这个词的正确名称,但是 我有一个用户模型。这个模型可以创建火车。这样user.trains就拥有了所有的列车。此模型还可以创建总线,以便user.bus拥有其所有总线。火车和公共汽车都可以装载货物。user.trains.cargo和user.bus.cargo 我该如何设置它,以便我可以只请求User.cargo并从火车和公共汽车上获取所有货物,而不必为每个人调用.cargo列表?您可以在rails中进行设置 由于您同时拥有Ruby on rails 通过其他型号的Rails 4进行收集,ruby-on-rails,ruby,Ruby On Rails,Ruby,我不知道该怎么用这个词,因为我不确定这个词的正确名称,但是 我有一个用户模型。这个模型可以创建火车。这样user.trains就拥有了所有的列车。此模型还可以创建总线,以便user.bus拥有其所有总线。火车和公共汽车都可以装载货物。user.trains.cargo和user.bus.cargo 我该如何设置它,以便我可以只请求User.cargo并从火车和公共汽车上获取所有货物,而不必为每个人调用.cargo列表?您可以在rails中进行设置 由于您同时拥有列车和总线,这两种类型都可以说是车
列车
和总线
,这两种类型都可以说是车辆
,因此您可以拥有一个基本车型车辆
,并让列车
和总线
继承自车辆
,如下所示:
class Vehicle < ActiveRecord::Base; end
class Train < Vehicle; end
class Bus < Vehicle; end
class车辆
然后,您的用户
类可以通过车辆
与货物
建立一对多
关联
这样,如果调用user.cargoes
(user
是user
的一个实例),结果应该是指定用户的所有货物
希望这能让您对这个问题有所了解……单表继承的答案可能对您很有用,特别是当火车和公共汽车的数据基本相同时。但是,如果这些模型彼此非常不同,您可能需要不同的解决方案 如果在用户类上定义了一个简单的方法呢
class User
has_many :trains
has_many :buses
def cargo
trains.map(&:cargo) + buses.map(&:cargo)
end
end
这个答案假设每辆公共汽车和火车都有一个货物,这与您显示的User.trains.cargo
的示例不同 我还没有尝试过,但似乎很有希望
class User < ActiveRecord::Base
has_many :buses
has_many :trains
scope :cargoes, ->{buses.select(:cargo).union_all(trains.select(:cargo))}
end
class用户{公共汽车.选择(:货物).联合所有(火车.选择(:货物))}
结束
这里有很多很好的答案,但这是最接近我实现的答案。谢谢这并不是在所有情况下都有效我有这个问题,但答案很好