我有几个可评论的模型(文章,帖子等)。目前,每个可评论模型都包含以下关联
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
答案 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_many
和validates_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