【问题标题】:Collection through other models Rails 4通过其他模型收集 Rails 4
【发布时间】:2015-11-04 08:19:19
【问题描述】:

我不确定如何措辞,因为我不确定这个词的正确术语是什么,但是..

我有一个用户模型。该模型可以创建火车。这样 user.trains 就有他们所有的火车。这个模型还可以创建总线,这样 user.buses 就拥有他们所有的总线。火车和公共汽车都可以包含货物。 user.trains.cargo 和 user.buses.cargo。

我将如何进行设置,以便我可以只要求 User.cargo 并从火车和公共汽车上获取所有货物,而不必分别调用 .cargo 列表?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    单表继承答案可能对您很有帮助,尤其是在 Trains 和 Buses 的数据基本相同的情况下。但是,如果这些模型彼此非常不同,您可能需要不同的解决方案。

    如果你在你的用户类上定义了一个简单的方法呢?

    class User
      has_many :trains
      has_many :buses
    
      def cargo
        trains.map(&:cargo) + buses.map(&:cargo)
      end
    end
    

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

    【讨论】:

    • 这里有很多很棒的答案,但这是最接近我实施的答案。谢谢
    【解决方案2】:

    您可以在 rails 中use the concept of Single Table inheritance

    由于你同时拥有TrainsBuses,这两者都可以说是Vehicle 的类型,你可以拥有一个基本模型Vehicle,并让TrainBusVehicle 继承如下:

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

    然后,您的User 类可以与CargoVehicle 建立one-to-many 关联。

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

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

    【讨论】:

    • 这不适用于我遇到问题的所有情况,但很好的答案
    【解决方案3】:

    我还没有尝试过,但 active_record_union 似乎很有希望。

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

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2016-07-24
      • 1970-01-01
      相关资源
      最近更新 更多