2012-12-23 93 views
2

我有以下結構:Rails模型關係,有很多屬於很多?

class User < ActiveRecord::Base 
end 

class Item < ActiveRecord::Base 
end 

class Group < ActiveRecord::Base 
end 

User可以創建(並且由此自身)一個Group
A GroupItems的列表以及可以訪問這些項目的Users的列表。 換句話說,用戶有一個Items的列表,並且可以控制哪個Users可以通過Group成員資格查看這些項目。

我該如何建立關係?

回答

5

那麼,你會遇到一些問題,因爲你需要在這裏建立雙重的多對多關係。 IE瀏覽器。組擁有並且屬於許多項目,並且項目具有並屬於許多用戶。

,我就建立了關係,這樣一來,假設你想要一組能夠有很多的項目,並且項目可能屬於一個以上的組:

User has_many :groups 
User has_and_belongs_to_many :items 
User has_many :own_items, :class_name => 'Item' 

Group belongs_to :user 
Group has_and_belongs_to_many :items 

Item has_and_belongs_to_many :groups 
Item has_and_belongs_to_many :users 
Item belongs_to :owner, :class_name => 'User' 

遷移過程將需要尋找像這樣:現在

# Group 
:user_id, :integer 

# Item 
:owner_id, :integer 

# GroupsItems 
:group_id 
:item_id 

#ItemsUsers 
:item_id 
:user_id 

,你看結構是不是宇宙最乾淨的,但它會表現得如您所願,只要你小心用戶關聯。

例如,創建一個用戶的項目:

@user = User.first 
@user.own_items.create(...) 

要指定用戶爲能夠查看項目...

@item = Item.find(...) #or @user.own_items.find(...) 
@item.users = [user1,user2,user3] 

現在,這個設置你想要的關係,但您還必須編寫自己的控制器/視圖邏輯來限制訪問,或使用CanCan等庫。

例如:

# View 
- if @item.users.include?(current_user) 
    ...show item... 

# Items Controller: 
def show 
    @item = Item.find(params[:id]) 
    if @item.users.include?(current_user) 
    ...continue... 
    else 
    redirect_to :back, :alert => 'You are not authorized to view this item.' 
    end 
end 

我希望這些例子你指出正確的方向。你會遇到許多問題需要處理與訪問控制相關的問題,但是試圖去思考並解決我能想到的每一個問題都不在這個問題的範圍之內。

另外,請注意,這是我能想到的最簡單的設置。如果你在關聯中有更復雜的邏輯,你可能想要建立一個完整的連接模型,並使用has_many:通過關聯而不是HABTM。

祝你好運!