Полиморфная модель вопроса в рельсах - поддерживает ли она отношения для вас? - PullRequest
1 голос
/ 09 мая 2011

Допустим, у вас есть SiteUpdate и модель Comment, и вы хотите сделать комментарий полиморфным.Вы делаете комментарий, держите "commentable_id" и "commentable_type" ...

Вот наша модель комментария:

class Comment < ActiveRecord::Base

  belongs_to :commentable, :polymorphic => true

  validates_presence_of :content
  validates_presence_of :commentable

end

Вот наш SiteUpdate:

class SiteUpdate < ActiveRecord::Base

  belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
  has_many :comments, :as => :commentable

  validates_presence_of :subject
  validates_length_of :subject, :maximum => 80
  validates_presence_of :intro
  validates_length_of :intro, :maximum => 200
  validates_presence_of :text
  validates_presence_of :author

  scope :sorted, order("site_updates.created_at desc")

end

Rails связывают комментарий с экземпляром site_update, или я должен сделать это вручную?

  @site_update.comments << Factory.build(:comment, :commentable_id => nil)
  @site_update.save

Это не удается -> он жалуется, что comment.commentable_id не должен быть пустым (я установил эту проверку в комментариимодель).

Так я делаю это вручную или неправильно настрою?

Или я вообще не проверяю это?

1 Ответ

1 голос
/ 09 мая 2011

Я предполагаю, что ваш @site_update объект является новым объектом. Если так ...

Есть кое-что раздражающее в ассоциациях рельсов. Вы не можете добавить их до того, как запись будет сохранена.

Что происходит, у вас есть новый объект обновления сайта без идентификатора. Вы создаете новый объект комментария для этого обновления сайта, поэтому он устанавливает commentable_type в «SiteUpdate», однако, пока нет идентификатора, поэтому он устанавливает commentable_id в ноль. Вы сохраняете, и он всплывает, чтобы сохранить связанные объекты, но он не устанавливает комментарий commentable_id к идентификатору SiteUpdate, потому что он не существует.

Так что если вы измените его на:

@site_update.save
@site_update.comments << Factory.build(:comment, :commentable_id => nil)
@site_update.comments.map { |c| c.save }

это должно работать.

Если это не новая запись ... она должна работать как есть.

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