Rails / ActiveRecord实现“监视列表”关系

时间:2010-10-21 14:00:31

标签: ruby-on-rails ruby 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来检索观看该项目的人群。

有人可以在这里提出一些建议吗?

1 个答案:

答案 0 :(得分: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