2011-11-23 47 views
5

我期待为我的UserLink模型添加Favorite模型。建模收藏夹

业务逻辑

  • 用户可以有多个链接(也就是他们可以添加多个链接)
  • 用户可以在喜欢的多条链路(自己或其他用户的)
  • 一个链接可以由多个用户收藏,但有一个所有者

我很困惑如何建模这种关联以及用户最喜欢b一旦模型到位就创建了吗?

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 

回答

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不会工作)。因此,我们创建了一个新的关联名称,并帮助Rails通过source属性知道要从中间关联中加载哪个关联。

下面是一些伪代码,使用这种关联:

# 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] 
+0

我需要创建'Favorite_Link'和'Favorited'模式? – Dru

+0

否; 'has_many:through'与'class_name'选项结合在一起表明Rails应该查看给定的关联关系,以便在那里找到另一个关联关系,实质上是跳过两个模型来获取正确的对象。 –

+0

DISREGARD [上面解释]:谢谢,我无法理解我们如何引用:favourites和:favorite_links模型中没有作为模型本身存在的模型。这种技术有没有名字?我想了解它是如何工作的。 – Dru