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 ...但我知道不是这样的.
如果您希望它确定用户在组上下文中可以执行的操作,那么在users表上拥有该角色对我没有意义.
它会意义是有它的memberships表组和用户.那么在这个表中的记录将有三列:user_id,group_id和role.
然后,要检索组的领导者,您将执行如下查询:
group.users.where("memberships.role = 'leader'").first
Run Code Online (Sandbox Code Playgroud)
哪里group是一个Group对象,即Group.first或Group.find(13).
这样就可以让你有可能在需要的情况下为一个小组进一步提供一个以上的领导者.
如果您的角色位于单独的表中,则可以执行以下操作:
group.users.where("memberships.role_id = ?", Role.find_by_name("leader").id).first
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
801 次 |
| 最近记录: |