【问题标题】:Modeling Favorites建模收藏夹
【发布时间】:2011-11-23 02:40:23
【问题描述】:

我希望将Favorite 模型添加到我的UserLink 模型中。

业务逻辑

  • 用户可以有多个链接(即可以添加多个链接)
  • 用户可以收藏多个链接(他们自己的或其他用户的)
  • 一个链接可以被多个用户收藏,但只有一个所有者

我很困惑如何为这种关联建模,以及一旦模型到位后如何创建用户最喜欢的?

class User < ActiveRecord::Base
  has_many :links
  has_many :favorites
end

class Link < ActiveRecord::Base
  belongs_to :user
  #can be favorited by multiple users 
end

class Favorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :link 
end

【问题讨论】:

    标签: ruby-on-rails ruby database ruby-on-rails-3


    【解决方案1】:

    下面的数据模型怎么样:

    class User < ActiveRecord::Base
      has_many :links
      has_many :favorites, :dependent => :destroy
      has_many :favorite_links, :through => :favorites, :source => :link
    end
    
    class Link < ActiveRecord::Base
      belongs_to :user
      has_many   :favorites, :dependent => :destroy
      has_many   :favorited, :through => :favorites, :source => :user
    end
    
    class Favorite < ActiveRecord::Base
      belongs_to :user
      belongs_to :link
    end
    

    由于User 已经有一个名为links 的关联,而Link 已经有一个名为users 的关联,我们不能为has_many :through 关联使用相同的名称(例如User has_many :links, :through =&gt; :favorites 将不起作用)。因此,我们发明了一个新的关联名称,并通过source 属性帮助 Rails 知道要从中间关联加载什么关联。

    这里有一些使用这个关联的伪代码:

    # Some users
    user1 = User.create :name => "User1"
    user2 = User.create :name => "User2"
    
    # They create some links
    link1_1 = user1.links.create :url => "http://link1_1"
    link1_2 = user1.links.create :url => "http://link1_2"
    link2_1 = user2.links.create :url => "http://link2_1"
    link2_2 = user2.links.create :url => "http://link2_2"
    
    # User1 favorites User2's first link
    user1.favorites.create :link => link2_1
    # User2 favorites both of User1's links
    user2.favorites.create :link => link1_1
    user2.favorites.create :link => link1_2
    
    user1.links          => [link1_1, link1_2]
    user1.favorite_links => [link2_1]
    user2.links          => [link2_1, link2_2]
    user2.favorite_links => [link1_1, link1_2]
    link1_1.favorited    => [user2]
    
    link2_1.destroy
    
    user1.favorite_links => []
    user2.links          => [link2_2]
    

    【讨论】:

    • 我需要创建Favorite_LinkFavorited 模型吗?
    • 否; has_many :through 结合 class_name 选项表明 Rails 应该在给定的关联中寻找另一个关联,本质上是跳过两个模型以获得正确的对象。
    • DISREGARD [上述解释]:谢谢,我无法理解如何在模型中引用 :favorite_links 和 :favorite_links,而这些模型本身不存在。这种技术有名字吗?我想阅读它以了解它是如何工作的。
    • 好的,我试试看。感谢您的详尽解释和伪代码
    • 默认情况下,Rails 会尝试根据关联来推断模型名称;我们通过关联中的class_name 选项告诉Rails 使用该模型。 Rails 根据定义关联的模型名称推断另一个表中的外键,因此无需额外配置。
    猜你喜欢
    • 2021-02-19
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多