我不认为你需要has_one
个协会,belongs_to
应该是你想要的.
在这种情况下,您希望在活动表上有一个target_id
和target_type
列,您可以通过t.references :target
调用在rake中创建它们(其中t
是table
变量).
class Campaign < ActiveRecord::Base
belongs_to :target, :polymorphic => true
end
现在,campaign可以关联到Tag
或Category
,@campaign.target
将返回适当的一个.
如果目标表上有一个外键指向Campaign
,则会使用has_one
关联.
例如,你的桌子会有
Tag: id, tag, campaign_id
他们两人都有belongs_to :campaign
人的联系.在这种情况下,必须使用has_one :tag
和has_one :category
,但此时不能使用通用target
.
这更有意义吗?
EDIT
由于target_id
和target_type
实际上是另一个表的外键,所以Campaign
属于其中一个.我能看出你对措辞的困惑,因为从逻辑上讲,Campaign
是容器.我想你可以把它想象成Campaign
有一个单一的目标,这是Tag
或Container
,因此它属于Tag
或Container
.
has_one
表示关系是在目标类上定义的.例如,Tag
应该通过has_one
关系与活动关联,因为标记类上没有标识关联的内容.在这种情况下,你应该
class Tag < ActiveRecord::Base
has_one :campaign, :as => :target
end
同样的Category
分.在这里,:as
关键字告诉rails哪个关联与Tag
相关.Rails不知道如何预先解决这个问题,因为它与Campaign
上的tag
没有关联.
另外两个可能会造成进一步混淆的选项是source
和source_type
选项.这些只在:through
个关系中使用,在这些关系中,您实际上加入了另一个表的关联.文档可能对其进行了更好的描述,但source
定义了关联名称,source_type
用于关联多态的地方.只有当目标关联(在:through
类上)有一个不明显的名称时,才需要使用它们——就像上面target and
Tag的例子一样——我们需要告诉rails使用哪一个.