Рельсы полиморфные модели - базовый класс - PullRequest
0 голосов
/ 26 февраля 2012

У меня есть несколько моделей, которые можно комментировать (статья, пост и т. Д.).В настоящий момент каждая комментируемая модель содержит следующую ассоциацию

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 Ответ

1 голос
/ 26 февраля 2012

Возможно, вам лучше создать модуль Commentable, а затем включить этот модуль.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...