2010-10-21 47 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.watchersuser.watched_items << item

+0

完美。谢谢! – Jeriko 2010-10-21 15:57:04

+0

这很有帮助,谢谢! – Levin 2014-12-17 14:46:38