2013-02-07 137 views
0

所以我是Rails n00b,我想创建一个“收藏夹”关系,这样用户可以拥有许多最喜欢的项目。我不完全知道如何做到这一点,这就是我要去尝试,但我不知道这是一个很好的做法都:在Rails中创建多对多关系

class User < ActiveRecord::Base 
has_many :favorites 
//other code 
end 

class Favorite < ActiveRecord::Base 
belong_to :user 
has_one :item 
end 

class Item < ActiveRecord::Base 
belongs_to :item 
end 

这是一个好办法做到这一点?我应该使用has_and_belongs_to_many吗? 我特别关注以下场景:说一个用户有100个最喜欢的项目。 当我做一个User.find(id)我也会检索100个最爱和100个项目?

在情况下,它是很重要的:红宝石版本1.9.3,版本轨3.2.11

回答

2

在你的情况has_many:通过肯定是要走的路。我会推荐阅读:http://guides.rubyonrails.org/association_basics.html

关于你的问题特别关注:

2.8的has_many之间进行选择:通过和has_and_belongs_to_many

的Rails提供了两种不同的方法来声明一个多到多模型之间的关系。更简单的方法是使用has_and_belongs_to_many,它使您可以直接的关联:

class Assembly < ActiveRecord::Base 
    has_and_belongs_to_many :parts 
end 

class Part < ActiveRecord::Base 
    has_and_belongs_to_many :assemblies 
end 

第二种方式来声明一个多一对多的关系是使用的has_many:通过。这使关联间接地通过联接模型:

class Assembly < ActiveRecord::Base 
    has_many :manifests 
    has_many :parts, :through => :manifests 
end 

class Manifest < ActiveRecord::Base 
    belongs_to :assembly 
    belongs_to :part 
end 

class Part < ActiveRecord::Base 
    has_many :manifests 
    has_many :assemblies, :through => :manifests 
end 

拇指的简单规则是,你应该建立一个的has_many:通过关系,如果你需要使用关系模型作为一个独立的工作实体。如果你不需要对关系模型做任何事情,可以更简单地设置has_and_belongs_to_many关系(尽管你需要记住在数据库中创建连接表)。

如果您需要验证,回调或加入模型上的额外属性,则应该使用has_many:through。

+0

@Peter_de_Ridder @Peter_de_Ridder这是非常有用的,但我不知道如果我需要创建一个迁移或者如果rails自动地做了一些事情使它工作,或者如果我必须自己在db – fernandohur

+0

你可以添加它到已有的连接表迁移。 –

3

你可以试试has_many => :through

class User < ActiveRecord::Base 
has_many :favorites 
has_many :items, :through => :favorites 
//other code 
end 
+0

如果需要,你会如何编写迁移? – fernandohur

+0

你不需要一个。 – shrimpsushi

0

它比使用has_and_belongs_to_many好。

当我做一个User.find(id)时,我是否还将检索100个收藏夹 和100个物品?

不,您只需获取用户对象。

更新: 调用User.include(:favourites, :items).find(id)将让你加入的情况下,你想从用户对象多次调用项目表的表。