STI и полиморфы

У меня есть проблема с моим кодом

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]

10
задан John Topley 8 April 2010 в 21:37
поделиться

2 ответа

Поле 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» , он должен был бы посмотреть на класс, чтобы определить таблицу. Таким образом, он может просто смотреть в таблицу и беспокоиться о типе, когда он туда попадает.

5
ответ дан 4 December 2019 в 02:25
поделиться

Посмотрите раздел Полиморфные ассоциации в 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
1
ответ дан 4 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: