【问题标题】:has_many :through default valueshas_many :通过默认值
【发布时间】:2010-04-26 14:20:17
【问题描述】:

我需要设计一个系统来跟踪具有不同角色(目前三个)组的用户成员资格。

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 来选择手动插入的数据:

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

但是在创建组成员身份时,没有设置 role_id。

有没有办法做到这一点,因为目前我的 Group 模型中的每个用户角色都有一段有些重复的代码。

更新

应该注意 id 理想的实现是类似于

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

这将创建该组的成员资格并适当地设置成员资格角色 (role_id)。

【问题讨论】:

  • 对不起,我为了发布而稍微重构了我的代码,我已经更新了发布的 sn-ps。
  • 用户不应该也有has_many :roles, :through =&gt; :memberships吗?
  • 目前不需要找到用户在他们所属的组中的所有角色。

标签: ruby-on-rails


【解决方案1】:

您始终可以在 Membership 模型中添加触发器,以便在创建此类分配时对其进行处理。例如:

class Membership < ActiveRecord::Base
  before_save :assign_default_role

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

这只是你的例子的改编。

【讨论】:

  • 不幸的是,考虑到角色的变化,这是行不通的。我已经更新了我的初始帖子以包含一些附加要求。
  • 您将不得不向这些关系添加范围条件,以便创建可以从范围继承。但是,如果必须不断解决这些问题,则为您的角色使用动态标签会带来麻烦。定义固定的“角色代码”将大大简化这一点。使用哈希样式的范围更好: { :role_id => Role::USER_ROLE_CODE }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
相关资源
最近更新 更多