【问题标题】:How do I specify the "commentable_type" field with polymorphic associations?如何指定具有多态关联的“commentable_type”字段?
【发布时间】:2008-10-29 14:09:38
【问题描述】:

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

您可以在文章和帖子上留下 cmets,因此我在评论和文章或帖子之间使用多态关联。

但是,由于 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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    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
    

    【讨论】:

    • 有一堆共享函数和 validates_length_of 用于一些共享字段。是否可以将其移动到模块中?
    【解决方案2】:

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

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

    一些参考资料:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 2012-01-11
      相关资源
      最近更新 更多