Rails多态模型 - 基类

时间:2012-02-25 23:51:48

标签: ruby-on-rails inheritance

我有几个可评论的模型(文章,帖子等)。目前,每个可评论模型都包含以下关联

has_many :comments, :as => :commentable

并且评论模型包含:

belongs_to :commentable, :polymorphic => true

我的可评论模型具有一些相似的特征,我希望它们能够使用一些相同的功能。但是,我认为MTI(多表继承)对于这种情况可能有点过分。我可以/可以创建一个他们都继承的基础模型类吗?即:

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

class Commentable < ActiveRecord::Base
  has_many :comments, :as => :commentable
  validates_presence_of :body
  def some_function
    ...
  end
end

class Article < Commentable
  ...
end

class Post < Commentable
  ...
end

1 个答案:

答案 0 :(得分:1)

您可能最好创建一个可注释模块,然后包含该模块。

module Commentable
    def some_function
       ...
    end
end

class Article < ActiveRecord::Base
    has_many :comments, :as => :commentable
    validates_presence_of :body

    include Commentable
    ....
end

如果您想避免重复has_manyvalidates_presence_of语句,可以按照模块的acts_as模式进行操作。

在这种情况下,您可以执行类似

的操作
# lib/acts_as_commentable.rb
module ActsAsCommentable

  extend ActiveSupport::Concern

  included do
  end

  module ClassMethods
    def acts_as_commentable
      has_many :comments, :as => :commentable
      validates_presence_of :body
    end
  end

  def some_method
    ...
  end

end
ActiveRecord::Base.send :include, ActsAsCommentable

# app/models/article.rb
class Article < ActiveRecord::Base
  acts_as_commentable
end