【问题标题】:When should I use polymorphism and has_many through? [closed]我什么时候应该使用多态性和 has_many through? [关闭]
【发布时间】:2013-11-24 23:35:36
【问题描述】:

我希望这不会被标记为太笼统或其他什么,但我一直试图围绕这两个概念思考一段时间,但令人惊讶的是,我还没有找到我想要的东西。

我的问题不是理解这些概念,而是知道何时使用它们。有人可以列出我应该问自己的几个问题,以确定这些关联是否是正确的解决方案吗?

我如何知道何时需要使用其中的每一个?

非常感谢。

【问题讨论】:

    标签: ruby-on-rails polymorphism associations


    【解决方案1】:

    当您遇到“A 有很多 B”而“B 有很多 A”的情况时,例如'一个公司可以有很多客户,一个客户可以有很多公司',你有两个选择之一:

    • 当关系只不过是一个简单的连接,并且您不需要存储有关每个连接的更多数据时,请使用 has_and_belongs_to_many
    • 当您想要控制 A 和 B 之间的连接表时,请使用 has_many, :through。这种关联使您能够存储有关每次交互的更多信息,例如当您想要说“当客户 A 与每家公司打交道时,我们想知道他们是怎么认识的、什么时候认识的等等。

    当一个表“可以应用于”许多其他表时,多态关联是另一种情况。一个例子是地址。假设您有客户、公司和员工。所有这些实体都有共同的数据:它们的地址。因此,您可以创建一个多态地址表,然后连接到所有其他地址表。因此,有时多态表被开玩笑地认为是“混杂的”,因为它们可以同时与任意数量的其他表进行交互。

    【讨论】:

      【解决方案2】:

      它们不一定是相关的概念。 has_many, :through 是为了简化多对多关系的接口,比如:

      乘客有很多飞机,飞机有很多乘客

      生成的架构需要一个连接表,如下所示:

      • 乘客有很多行程
      • 飞机有很多行程
      • 行程只有一个飞机
      • 行程只有一名乘客

      AR 关联可以这样写:

      class Passenger < ActiveRecord::Base
        has_many :itineraries
        has_many :planes, through :itineraries
      end
      

      所以现在您可以通过 ActiveRecord 查询界面访问乘客乘坐的所有飞机:

      traveler = Passenger.find(1)
      traveler.planes #returns all planes associated with that passenger's itineraries. 
      

      has_many 的使用,通过:使您不必在查询、添加或更新关联时直接访问行程连接表。

      【讨论】:

        猜你喜欢
        • 2016-04-19
        • 2012-12-23
        • 2021-07-13
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多