开发者

Rails 3, how to make sure Group has_one user.role = groupleader

开发者 https://www.devze.com 2023-04-10 04:20 出处:网络
My current Group model: class Group < ActiveRecord::Base has_many :memberships, :dependent => :destroy

My current Group model:

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

My Current User Model

 class User < ActiveRecord::Base
      has_and_belongs_to_many :roles
      has_many :memberships, :dependent => :destroy
      has_many :groups, :through => :memberships
      #some more stuff
    end 

Membership Model

class Membership < ActiveRecord::Base
  attr_accessible :user_id, :group_id
  belongs_to :user
  belongs_to :group 
end

Role Model

class Role < ActiveRecord::Base
  has_and_belongs_to_many开发者_开发问答 :users
end

I have a Ability class and CanCan installed to handle roles. I have a role type groupleader and need to make sure a Group has only one groupleader...

I think its something like: Group has_one User.role :groupleader... but I know thats not it.


It doesn't make sense to me to have the role on the users table if you want it to determine what the user can do within the context of a group.

Where it would make sense is to have it on the memberships table for groups and users. Records in this table would then have three columns: user_id, group_id and role.

Then to retrieve the leader for the group you would execute a query like this:

group.users.where("memberships.role = 'leader'").first

Where group is a Group object, i.e. Group.first or Group.find(13).

This then leaves open the possibility that you can have more than one leader for a group further down the track if required.


If your roles are in a separate table, then you can do this:

group.users.where("memberships.role_id = ?", Role.find_by_name("leader").id).first
0

精彩评论

暂无评论...
验证码 换一张
取 消