2010-04-26 63 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