【发布时间】:2013-11-24 23:35:36
【问题描述】:
我希望这不会被标记为太笼统或其他什么,但我一直试图围绕这两个概念思考一段时间,但令人惊讶的是,我还没有找到我想要的东西。
我的问题不是理解这些概念,而是知道何时使用它们。有人可以列出我应该问自己的几个问题,以确定这些关联是否是正确的解决方案吗?
我如何知道何时需要使用其中的每一个?
非常感谢。
【问题讨论】:
标签: ruby-on-rails polymorphism associations
我希望这不会被标记为太笼统或其他什么,但我一直试图围绕这两个概念思考一段时间,但令人惊讶的是,我还没有找到我想要的东西。
我的问题不是理解这些概念,而是知道何时使用它们。有人可以列出我应该问自己的几个问题,以确定这些关联是否是正确的解决方案吗?
我如何知道何时需要使用其中的每一个?
非常感谢。
【问题讨论】:
标签: ruby-on-rails polymorphism associations
当您遇到“A 有很多 B”而“B 有很多 A”的情况时,例如'一个公司可以有很多客户,一个客户可以有很多公司',你有两个选择之一:
has_and_belongs_to_many。has_many, :through。这种关联使您能够存储有关每次交互的更多信息,例如当您想要说“当客户 A 与每家公司打交道时,我们想知道他们是怎么认识的、什么时候认识的等等。当一个表“可以应用于”许多其他表时,多态关联是另一种情况。一个例子是地址。假设您有客户、公司和员工。所有这些实体都有共同的数据:它们的地址。因此,您可以创建一个多态地址表,然后连接到所有其他地址表。因此,有时多态表被开玩笑地认为是“混杂的”,因为它们可以同时与任意数量的其他表进行交互。
【讨论】:
它们不一定是相关的概念。 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 的使用,通过:使您不必在查询、添加或更新关联时直接访问行程连接表。
【讨论】: