如何指定具有多态关联的“commentable_type”字段?

时间:2008-10-29 14:09:38

标签: ruby-on-rails ruby

我有两个模型,Article和Post都继承自名为ContentBase的基础模型。

您可以对文章和帖子发表评论,因此我使用评论和文章或帖子之间的多态关联。

但是,由于Article和Post都继承自ContentBase,因此commentable_type字段最终成为两者的“ContentBase”并将所有内容搞砸。

有没有办法在Article和Post中的has_many关系中指定commentable_type字段?

编辑:

通过“搞砸了一切”我的意思是如果有一个ID为1的文章和ID为1的帖子,并且我在commentable_id = 1,commentable_type = ContentBase中添加了一条评论,该评论将显示在文章和交。

以下是代码:

class Article < BaseContent
  has_many :comments, :as => :commentable
end

class Post < BaseContent
  has_many :comments, :as => :commentable
end

这是我的评论模型:

class Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorphic => true
end

2 个答案:

答案 0 :(得分:2)

ContentBase类中有什么?您可以将该代码移动到模块中而不是使用继承吗?

Module BaseContent
   def self.included(base)
      base.class_eval do
        validates_presence_of     :somefield
        validates_length_of       :someotherfield

        def my_method
          "hello"
        end
      end
   end

end

答案 1 :(得分:1)

我认为你不想这样做。对于多态关联,您希望XXX_type字段是基本模型类,而不是实际类。我不确定原因,但我认为它与确定要从中选择的表名来获取多态数据有关。

我认为您需要查看单表继承,这是ActiveRecord用于在数据库中存储派生类的内容。它假定由于Article和Post是ContentBase的子类,它们都将在同一个表中(默认情况下为“content_bases”)。如果是这种情况,您将永远不会有ID = 1的文章和ID = 1的帖子。

一些参考文献: