那麼,你會遇到一些問題,因爲你需要在這裏建立雙重的多對多關係。 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。
祝你好運!