Как мне указать поле "commentable_type" с полиморфными ассоциациями? - PullRequest
3 голосов
/ 29 октября 2008

У меня есть две модели, Article и Post, которые обе наследуются от базовой модели, называемой ContentBase.

Вы можете оставлять комментарии как к статьям, так и к сообщениям, поэтому я использую полиморфную ассоциацию между комментариями и статьей или публикацией.

Однако, так как Article и Post наследуются от ContentBase, поле commentable_type в конечном итоге становится «ContentBase» для обоих и все испортило.

Есть ли способ указать поле commentable_type в отношении has_many в Article и Post?

Edit:

Под словом "все портит" я подразумеваю, если есть статья с 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 ]

2 голосов
/ 29 октября 2008

Что входит в класс 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 голос
/ 29 октября 2008

Не думаю, что ты хочешь это сделать. Для полиморфных ассоциаций вы хотите, чтобы поле XXX_type было классом базовой модели, а не фактическим классом. Я не совсем уверен в причине, но я полагаю, что это связано с определением имени таблицы для выбора, чтобы получить полиморфные данные.

Я думаю, вам нужно взглянуть на наследование отдельных таблиц, которое ActiveRecord использует для хранения производных классов в базе данных. Предполагается, что поскольку Article и Post являются подклассами ContentBase, все они будут находиться в одной таблице (по умолчанию "content_bases"). В таком случае у вас никогда не будет Статьи с ID = 1 и Поста с ID = 1.

Несколько ссылок:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...