我正在尝试"延伸";Rolify功能具有一些全局角色,如"管理员"、"会员"、"客人"等;scopes";对于具有特定角色的每个用户。
例如,在我的应用程序中,我有一个admin
角色,它是一个";超级角色";这意味着它基本上允许访问所有内容。但我也希望能够";"范围";对于另一个用户的此角色,范围将是,例如,"他可以访问所有用户,但前提是他们来自国家A、B、C和城市X、Y、Z"。我知道rolify支持不同范围的不同角色,但我想要的是管理"全球角色";不同的作用域只适用于不同的用户。
我想过做一些类似于属于角色和用户的"范围"模型的事情,在这个模型中,我将与国家和城市建立HABTM关系,然后使用它进行授权(我使用的是CanCanCan(。但在采用这种方法时,我遇到了很多问题。它有点像:
class Scope
belongs_to :user
belongs_to :role
has_and_belongs_to_many :countries
has_and_belongs_to_many :cities
end
我遇到的一个问题是,我需要在创建作用域的同时授予该角色,如果用户被"吊销"角色,则需要销毁属于该用户和该角色的作用域。我发现最后一部分特别困难,因为"Scope"one_answers"users_roles"表无关。
有人知道解决这个问题的更好方法吗?我很难找到一种正确的方式来拥有一个为每个用户都有自定义作用域的角色(基本上,我需要在用户和角色中间有一些东西来定义该角色的用户作用域(。
感谢我能得到的任何帮助!
如果你想创建自己的东西,has_and_belongs_to_many
不是答案(提示:它几乎从来都不是正确的答案(。使用HABTM是Rolify的致命弱点,因为它的关联看起来像这样:
class User
has_and_belongs_to_many :roles
end
class Role
has_and_belongs_to_many :users
belongs_to :resource,
polymorphic: true,
optional: true
end
这不允许您直接查询users_roles表或添加其他列或逻辑。自2013年以来,修复它一直是一个悬而未决的问题。有变通办法,但Rolify可能无论如何都不是适合这里工作的工具。
如果你想自己滚动,你想使用has_many through:
来设置一个实际的联接模型,这样你就可以直接查询联接表,并向其添加关联、附加列和逻辑。
class User
has_many :user_roles
has_many :roles, through: :user_roles
end
class UserRole
belongs_to :user
belongs_to :role
belongs_to :resource,
polymorphic: true,
optional: true
validates_uniqueness_of :user_id,
scope: [:role_id, :resource_id, :resource_type]
end
class Role
validates :name, presence: true,
uniqueness: true
has_many :user_roles
has_many :roles, through: :user_roles
end
这将资源范围从按角色移动到按用户。
虽然您可以在CCD_ 4表和";scoped";除非你想避免多态性asssociations,否则资源并不是绝对必要的。