我有以下内容:
- 一个链接模型
- 一个LinkItem模型,我希望它是以下类型之一
- 评论
- 标签
- ...
我正在使用以下代码:
链接模型
class Link < ActiveRecord::Base
has_many :link_items
end
链接项模型
class LinkItem < ActiveRecord::Base
belongs_to :link
end
class Comment < LinkItem
end
class Tag < LinkItem
end
现在我不知道如何告诉Rails我的LinkItem模型应该是多态的。我已经阅读了Rails Guide on asociations和其他教程,但这些教程只描述了如何创建一个属于多个其他模型的belongs_to关联,而不是另一种方式。
所以我的问题是:
如何创建一个has_many关联,其中关联实例可以是不同类型的?或者创建单独的模型来处理评论、标签等,并将它们各自与我的Link模型关联起来是否更好?
编辑
实际上我的代码可以工作。
我尝试在我的数据库中使用'type'列(而不是'link_item_type'),Rails会自动使用它来保存/确定我的LinkItems的正确子类(感谢Wizard of Ogz的提示)
然而,我仍然无法在引用LinkItem之前访问LinkItem的子类。这是某种惰性加载吗?
link.link_items
时,应返回由任何组合的LinkItem
、Comment
和Tag
记录组成的数组。也许你正在测试的记录的“类型”列设置为NULL,在这种情况下,ActiveRecord将只将它们全部实例化为LinkItem
。 - Wizard of Ogzlink.link_items
时,我得到了正如你所提到的那样的数组。我的错误是使用了link_item_type
列而不仅仅是type
。@nicholaides 提到的指南在我的情况下有点误导,因为那里使用了前一种命名约定,即imageable_type
而不是type
(请参见指南中的CreatePictures < ActiveRecord::Migration
)。但是,每当我在没有先调用LinkItem
的情况下尝试访问Tag
模型时,我仍然会得到NameError: uninitialized constant Tag
。这只发生在开发模式下。 - whitecorps