2010-04-26 81 views
1

我需要設計一個系統來跟蹤用戶成員身份,以不同角色(當前爲三個)的組。has_many:通過默認值

class Group < ActiveRecord::Base 
has_many :memberships 
has_many :users, :through => :memberships 
end 

class Role < ActiveRecord::Base 
has_many :memberships 
has_many :users, :through => :memberships 
end 

class Membership < ActiveRecord::Base 
belongs_to :user 
belongs_to :role 
belongs_to :group 
end 

class User < ActiveRecord::Base 
has_many :memberships 
has_many :groups, :through => :memberships 
end 

理想情況下我要的是簡單地設置

@group.users << @user 

,並有成員有正確的角色。我可以使用:條件來選擇已手動插入的數據,例如:

:conditions => ["memberships.role_id= ? ", Grouprole.find_by_name('user')] 

但是,在創建組的成員資格時,role_id未設置。

有沒有辦法做到這一點,因爲目前我的組模型中的每個用戶角色都有一些重複的代碼片段。

修訂

應該注意的是什麼ID非常喜歡實現類似於

@group.admins << @user 
@group.moderators << @user 

這東西會讓人產生成員到組並設置適當的成員角色(ROLE_ID)。

+0

什麼是Grouprole? – 2010-04-26 14:34:04

+0

對不起我重構了我的代碼稍微張貼,我已更新張貼的片段。 – 2010-04-26 14:49:42

+0

用戶不應該擁有'has_many:roles,:through =>:memberships'? – SztupY 2010-04-26 14:55:18

回答

0

您可以隨時在會員模型中添加觸發器來處理創建時的分配。例如:

class Membership < ActiveRecord::Base 
    before_save :assign_default_role 

protected 
    def assign_default_role 
    self.role = Role.find_by_name('user') 
    end 
end 

這只是您的示例的改編。

+0

不幸的是,考慮到角色的變化,這是行不通的。我更新了我的初始帖子,以包含一些額外要求。 – 2010-04-26 15:00:10

+1

您將不得不將範圍條件添加到這些關係中,以便創建可以從範圍繼承。然而,使用動態標籤作爲你的角色,如果他們必須不斷解決,將會帶來麻煩。定義固定的「角色代碼」將大大簡化這一點。使用哈希樣式作用域對此更好:{:role_id => Role :: USER_ROLE_CODE} – tadman 2010-04-26 15:18:39