代码之家  ›  专栏  ›  技术社区  ›  Jeriko

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

  •  4
  • Jeriko  · 技术社区  · 14 年前

    我在寻找如何最好地为我目前正在开发的应用程序构建一个“观察列表”的建议。

    型号如下:

    # 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 回复  |  直到 14 年前
        1
  •  3
  •   Matt    14 年前

    你必须定义:

    # 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