2010-03-10 68 views
3

我有一個聲明授權運行的紅寶石應用程序,我所做的角色給角色分配給用戶數據庫策略:幫助在特定模型實例

管理(應用程序管理員) org_admin(組織administratr) org_colab(組織合作者) org_visitor(組織訪問者)

a用戶可以has_many組織,他可以是管理員或合作者。

我鏈接使用所屬表

什麼是解決這個多對多的角色,最好的策略呢?

要在聯盟表上添加額外的屬性? 像:單位(:USER_ID:整數,:的organization_ID:整數,:affiliation_type:整數)

和從屬關係類型可以是用於對org_visitor 0 org_colab爲org_admin和1和2?

我想必須有角色分配給特定的組織更好的方式...

回答

2

這是典型的「用戶組 - 角色」的模式。這是一種三元關係。用戶組是多對多的;羣組角色也是如此。你需要五張表來捕捉它。

您將從用戶表開始。它會有一個主鍵(當然)。與組和角色一樣。

在E/R圖中,UserGroup表位於User和Group表之間。 UserGroup將有兩列:user_id和group_id。主鍵將是組合(user_id,group_id)。 user_id列將與用戶表的主鍵具有外鍵關係。同上的group_id列和組表。

將會有與團隊和角色類似的安排。每個都有一個主鍵。 GroupRole表將在您的E/R圖中位於兩者之間。重複上面的措辭,你就會擁有它。

我會創建一個E/R圖來展示給你,但我正忙於做其他一些事情。我希望這對你來說已經足夠了。如果不是,那麼稍後我可能會添加它。

所以用戶沒有角色;團體做。您將用戶添加到組,並且該用戶將獲得該組擁有的所有授權。這樣您就可以爲特定的組添加一個特定的角色(例如,管理員組的管理員權限)。然後添加到該組的所有人都將獲得這些權限。

+0

這是一個有點含糊了我。 讓我們看看,我有這個: 用戶* --- 1關聯1 --- *組 我正在考慮在角色類型的關聯表中添加一個額外的屬性。 你能解釋5列模型是怎麼樣的? – 2010-03-10 01:09:33

+1

不是五列模型,而是五表模型。您將擁有用戶,組和角色表。您還將擁有UserGroup和GroupRole關係表以執行多對多關係。 – duffymo 2010-03-10 01:16:53

+0

好吧...... 我的用戶組是我所屬的表(USER_ID和GROUP_ID) ,但我不明白的GroupRole? (group_id&role_id)? 爲什麼本集團與角色而不是用戶關聯? – 2010-03-10 01:25:29

1

我實際上實現了類似於我的項目的東西。爲了澄清我是否理解你是正確的 - 你的用戶可能在整個應用程序上下文中發揮作用,以及在組織上下文中可能不相互依賴的特定角色。

實用的解決方案可能是實現兩個不同的角色集。讓我們考慮以下結構:您有一個用戶模型(具有應用程序範圍的信息),一個組織模型(它定義了一個組織並可能爲用戶所有)和一個協作模型,它定義了一個用戶和組織。

在這種情況下,最好將角色存儲在用戶模型中(用於執行應用程序範圍內的任務),並將組織特定的角色存儲在協作模型中。

我在模型中使用了一個基於字符串的角色存儲與ryan bates cancan-gem--其易於使用的&並將角色邏輯放置在指定位置。

這可能不適用於成千上萬種不同的角色和組和東西的工作,在這種情況下,你應該實現角色存儲在一個額外的模型(帶有多態性關係到用戶和collaboratives)。

最良好的祝願 - 弗洛裏安

編輯:要通過ActiveRecord的搜索,落實你可能想用「serialize'特徵爲:角色的字段,如的ActiveRecord :: Base的描述。

+0

感謝您的幫助Florian。 我正在使用一個與您的系統非常相似的系統,但不是使用cancan,而是編寫了一個模塊來管理所有邏輯問題並評估授權。這遠非完美,我將嘗試在未來學習其他方法,但目前它運行良好。 – 2010-08-28 07:33:10