Rails 3,如何确保Group has_one user.role = groupleader

TJ *_*ill 2 ruby-on-rails cancan ruby-on-rails-3

我目前的群组模型:

class Group < ActiveRecord::Base
   has_many :memberships, :dependent => :destroy
   has_many :users, :through => :memberships
end
Run Code Online (Sandbox Code Playgroud)

我目前的用户模型

 class User < ActiveRecord::Base
      has_and_belongs_to_many :roles
      has_many :memberships, :dependent => :destroy
      has_many :groups, :through => :memberships
      #some more stuff
    end 
Run Code Online (Sandbox Code Playgroud)

会员模型

class Membership < ActiveRecord::Base
  attr_accessible :user_id, :group_id
  belongs_to :user
  belongs_to :group 
end
Run Code Online (Sandbox Code Playgroud)

榜样

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end
Run Code Online (Sandbox Code Playgroud)

我安装了Ability类和CanCan来处理角色.我有一个角色类型的组长,需要确保一个组只有一个组头...

我认为它类似于:Group has_one User.role:groupleader ...但我知道不是这样的.

Rya*_*igg 5

如果您希望它确定用户在组上下文中可以执行的操作,那么在users表上拥有该角色对我没有意义.

意义是有它的memberships表组和用户.那么在这个表中的记录将有三列:user_id,group_idrole.

然后,要检索组的领导者,您将执行如下查询:

group.users.where("memberships.role = 'leader'").first
Run Code Online (Sandbox Code Playgroud)

哪里group是一个Group对象,即Group.firstGroup.find(13).

这样就可以让你有可能在需要的情况下为一个小组进一步提供一个以上的领导者.


如果您的角色位于单独的表中,则可以执行以下操作:

group.users.where("memberships.role_id = ?", Role.find_by_name("leader").id).first
Run Code Online (Sandbox Code Playgroud)