建模收藏夹

5
我希望为我的“用户”和“链接”模型添加一个“收藏夹”模型。 业务逻辑
  • 用户可以拥有多个链接(即,他们可以添加多个链接)
  • 用户可以收藏多个链接(自己的或其他用户的)
  • 一个链接可以被多个用户收藏,但只有一个所有者
我不确定如何建立这种关联,并且一旦建立了模型,用户如何创建收藏。
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
1个回答

8
以下数据模型怎么样:
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 => :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]

不是的;has_many :through 结合 class_name 选项表示 Rails 应该在给定关联中查找另一个关联,从而通过两个模型来获取正确的对象。 - Michelle Tilley
不理会[上面解释的内容]:谢谢,我不太明白我们如何在模型中引用:favorited和:favorite_links,而这些本身并不是模型。这种技术有一个名称吗?我想阅读相关资料以了解其工作原理。 - Dru
谢谢,我会尝试的。我非常感激你的帮助,这会让我开始动手。 - Dru
谢谢,我正在实现代码。您能解释一下用户模型中:favorites和:favorite_links之间的区别吗?在审查伪代码时,我注意到一个用于创建收藏夹,另一个用于显示收藏夹。我可以将它们分组吗? - Dru
换句话说,你可以将has_many:favorite_links,:through =>:favorites看作是通过用户的“收藏夹”查找并进入这些收藏所属的“链接”。这只是一种快捷方式,本质上与user.favorites.map {|f| f.link}相同(但更有效)。 - Michelle Tilley
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接