Rails / ActiveRecord, реализующие отношение «Watch list» - PullRequest
4 голосов
/ 21 октября 2010

Я ищу совет о том, как лучше создать «список наблюдения» для приложения, над которым я сейчас работаю.

Модели следующим образом:

# user.rb
has_many :items

# item.rb
belongs_to :user

Мне нужно добавить список наблюдения, где пользователи могут добавлять в избранное определенные элементы, не вступая в права собственности.

Я пробовал следующее:

# user.rb
has_many :items
has_many :watches
has_many :items, :through => :watches

# watch.rb (user_id:integer, item_id:integer)
belongs_to :user
belongs_to :item

# item.rb (user_id:integer)
belongs_to :user
has_many :watches
has_many :users, :through => :watches  # as => :watchers

Это работает, но не дает желаемого ответа. Среди прочего я получаю ошибку AssosciationTypeMismatch: Watch expected, got Item, из-за которой я думаю, что у меня неправильно настроены модели.

В идеале, я хотел бы иметь возможность делать такие вещи, как user.watches << item, чтобы начать смотреть объект, и item.watchers, чтобы получить коллекцию людей, наблюдающих за элементом.

Может кто-нибудь предложить некоторые предложения здесь?

1 Ответ

3 голосов
/ 21 октября 2010

Вы должны определить:

# user.rb
has_many :items
has_many :watches
has_many :watched_items, :through => :watches


# item.rb
belongs_to :user
has_many :watches
has_many :watchers, :through => :watches

и

# watch.rb
belongs_to :watcher, :class_name => 'User', :foreign_key => "user_id"
belongs_to :watched_item, :class_name => 'Item', :foreign_key => "item_id"

, чтобы иметь возможность звонить item.watchers и user.watched_items << item

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