Rails Полиморфные ассоциации: как получить и изменить commentable?

#ruby-on-rails

#ruby-on-rails

Вопрос:

Существует 3 модели, скажем, Article, Picture и Comment. Комментарий — это, конечно, полиморфная модель.

Теперь я могу сделать что-то вроде @article.comments и захватить комментарии, но если у меня есть комментарий, как я могу узнать, происходит ли он из статьи или рисунка? База данных содержит только идентификатор. Я пробовал это (http://guides.rubyonrails.org/association_basics.html#polymorphic-associations ), но только что получил обратно nil для commentable.

Кроме того, как я могу переместить комментарий к картинке в комментарий к статье? Комментарий привязан к определенному идентификатору статьи в commentable_id, как я могу изменить этот конкретный комментарий, чтобы он стал комментарием к определенному изображению?

РЕДАКТИРОВАТЬ: Я ПРОБОВАЛ ЭТО И НЕ СРАБОТАЛО

 ruby-1.9.2-p180 :001 > user = User.find_by_username('name')
ruby-1.9.2-p180 :002 > user.owned_items
 => [#<OwnedItem id: 81233384, ownable_id: 861022540, user_id: 986759322, ...
ruby-1.9.2-p180 :003 > user.owned_items[0].ownable
 => nil 
  

Ответ №1:

 def Article < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

def Picture < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

def Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorpic => true
end
  

Но вы, вероятно, уже зашли так далеко 😉 Теперь вы можете сделать что-то вроде comment.where(:commentable_type => 'Event').commentable , и это вернет событие для комментария.

Комментарии:

1. Иван, я действительно пробовал это (я упоминаю об этом в вопросе). Я отредактирую выше, чтобы показать. Комментарий был здесь просто примером, поэтому я буду использовать другие названия моделей, но это проиллюстрирует.