Конфликтующие ассоциации в has_many_polymorphs - PullRequest
3 голосов
/ 20 января 2011

Я использую has_many_polymorphs для создания функции «Избранное» на сайте, где несколько пользователей могут публиковать истории и оставлять комментарии.Я хочу, чтобы пользователи могли "любимые" истории и комментарии.

class User < ActiveRecord::Base
 has_many :stories
 has_many :comments

 has_many_polymorphs :favorites, :from => [:stories, :comments]
end

class Story < ActiveRecord::Base
  belongs_to :user, :counter_cache => true
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :user, :counter_cache => true
  belongs_to :story, :counter_cache => true
end

class FavoritesUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :favorite, :polymorphic => true
end

Теперь, скажем, @user пишет историю.Теперь @ user.stories.size = 1. Затем @user добавляет другую историю в избранное.Теперь @ user.stories ... подожди минутку.@user has_many: сюжеты и: has_many: сюжеты через: избранное.

Проблема возникает, когда я пытаюсь позвонить @ user.stories или @ user.comments.Я хочу назвать @ user.stories для историй, которые им принадлежат, и @ user.flected.stories для историй, которые они любят.

Итак, я попробовал это:

class User < ActiveRecord::Base
 has_many :stories
 has_many :comments

 has_many_polymorphs :favorites, :from => [:favorite_stories, :favorite_comments]
end

, а затем подклассы Story and Commentвот так:

class FavoriteStory < Story
end

class FavoriteComment < Comment
end

Это решило проблему, потому что теперь я могу вызывать @ user.stories и @ user.favorite_stories.

НО , когда я получаю эту ошибку вссылка на комментарии:

ActiveRecord :: Associates :: PolymorphicError в UsersController # show

Could not find a valid class for :favorite_comments (tried FavoriteComment). If it's namespaced, be sure to specify it as :"module/favorite_comments" instead.

Я нашел обсуждение этой ошибки в аналогичном контексте , но это не отвечает на мой вопрос.

Что здесь происходит?Как я могу сделать это лучше?

1 Ответ

0 голосов
/ 26 мая 2012

Как насчет этого?

class UserFavorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :favorite, :polymorphic => true
end

class User < ActiveRecord::Base
  has_many :favourite_story_items, :class_name => "UserFavourite", :conditions => "type = 'Story'"
  has_many :favourite_stories, :through => :favourite_story_items, :as => :favourite
  has_many :favourite_comment_items, :class_name => "UserFavourite", :conditions => "type = 'Comment'"
  has_many :favourite_comments, :through => :favourite_comment_items, :as => :favourite
end
...