Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过其他型号的Rails 4进行收集_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 通过其他型号的Rails 4进行收集

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中进行设置 由于您同时拥有列车和总线,这两种类型都可以说是车

我不知道该怎么用这个词,因为我不确定这个词的正确名称,但是

我有一个用户模型。这个模型可以创建火车。这样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用户{公共汽车.选择(:货物).联合所有(火车.选择(:货物))}
结束

这里有很多很好的答案,但这是最接近我实现的答案。谢谢这并不是在所有情况下都有效我有这个问题,但答案很好