我正在寻找有关如何最好地构建我正在使用的应用程序的“观察列表”的建议。
模型如下:
# 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
来检索观看该项目的人群。
有人可以在这里提出一些建议吗?
答案 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.watchers
和user.watched_items << item