2010-10-21 2 views
4

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

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

# 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, чтобы получить коллекцию людей, просматривающих этот предмет.

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

ответ

3

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

# 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

+0

Совершенная. Благодаря! – Jeriko

+0

Это было полезно, спасибо! – Levin

Смежные вопросы