У меня есть проблема с моим кодом
class Post < ActiveRecord::Base
end
class NewsArticle < Post
has_many :comments, :as => :commentable, :dependent => :destroy, :order => 'created_at'
end
class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true, :counter_cache => true
end
И на попытке идут, получают комментарии для некоторого NewsArticle, как который я вижу в журналах что-то
Comment Load (0.9ms) SELECT "comments".* FROM "comments" WHERE ("comments"."commentable_id" = 1 and "comments"."commentable_type" = 'Post') ORDER BY created_at
Странный это "commentable_type" = 'Сообщение'. Что случилось?
PS: Направляющие 2.3.5 && рубиновых 1.8.7 (10.01.2010 уровней установки патча 249) [i686-darwin10]
Поле commentable_type должно быть сохранить имя таблицы, содержащей данные, после загрузки этой строки из правой таблицы унаследованный тип будет загружен из столбца type в таблице Posts .
Итак:
Здесь комментарий указывает на таблицу, к которой он комментирует. Таблица сообщений, id 1
>> Comment.first
=> #<Comment id: 1, commentable_id: 1, commentable_type: "Post", body: "test", created_at: "2010-04-09 00:56:36", updated_at: "2010-04-09 00:56:36">
Затем, чтобы загрузить NewsArticle, id 1 загружается из сообщений, а тип там указывает NewsArticle.
>> Comment.first.commentable
=> #<NewsArticle id: 1, type: "NewsArticle", name: "one", body: "body", created_at: "2010-04-09 00:55:35", updated_at: "2010-04-09 00:55:35">
>> Comment.first.commentable.class.table_name
=> "posts"
Если бы commentable_type содержал «NewsArticle»
, он должен был бы посмотреть на класс, чтобы определить таблицу. Таким образом, он может просто смотреть в таблицу и беспокоиться о типе, когда он туда попадает.
Посмотрите раздел Полиморфные ассоциации в ActiveRecord::Associations API. Там есть немного об использовании полиморфных ассоциаций в сочетании с наследованием одной таблицы. Следуя второму примеру кода в этом разделе, я думаю, что это может быть близко к тому, что вы хотите
class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true, :counter_cache => true
def commentable_type=(sType)
super(sType.to_s.classify.constantize.base_class.to_s)
end
end
class Post < ActiveRecord::Base
has_many :comments, :as => :commentable, :dependent => :destroy, :order => 'created_at'
end
class NewsArticle < Post
end