2013-02-07 55 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)將讓你加入的情況下,你想從用戶對象多次調用項目表的表。