使用 Rolify/Devise/Cancancan 与角色关联
Posted
技术标签:
【中文标题】使用 Rolify/Devise/Cancancan 与角色关联【英文标题】:Associations with Roles using Rolify/Devise/Cancancan 【发布时间】:2021-09-13 18:49:55 【问题描述】:我在某处读到使用 Rolify/Devise/Cancancan 是配置两个具有登录功能的设计模型(使用一个登录页面而不是两个)以及它们各自在其他模型之间的关联的更好选择。我对如何在内部设置角色并仍然使用关联感到困惑。例如:
如果我使用了两个 Devise 模型,它们就会......
class Supervisor < ApplicationRecord
has_many :employees
end
class Employee < ApplicationRecord
belongs_to :supervisor
end
但是对于 Rolify,我想做以下事情:
-
管理员 - 此用户应该能够设置其他用户的角色
主管 - (例如,此用户可以设置员工时间表)
员工
我做错了吗?我知道这个例子很模糊,我似乎无法在任何地方找到关于如何设置与角色的关联的答案。
【问题讨论】:
【参考方案1】:您要查找的内容很可能是self-referential association:
class AddSupervisorToUsers < ActiveRecord::Migration[6.1]
def change
add_reference :users, :supervisor,
null: true,
foreign_key: to_table: :users
end
end
class User < ApplicationRecord
belongs_to :supervisor,
class_name: 'User',
optional: true,
inverse_of: :employees
has_many :employees,
class_name: 'User',
foreign_key: :supervisor_id,
inverse_of: :supervisor
end
这基本上只是一个指向同一张表的关联。请注意,外键列必须可以为空以避免鸡与蛋的情况,这会阻止您创建任何用户(如果表为空)。
虽然您可以通过以下方式使用 Rolify 做到这一点:
user.add_role(:supervisor, User.first) # add a role
User.with_role(:supervisor, User.first) # query for supervisors
这实际上并不等同,因为没有什么可以阻止多个用户成为一个用户的主管。由于角色模型中的关联是多态的,因此您也没有外键来确保引用完整性。
虽然 Rolify 对于某些用例来说是一个很棒的工具,但您可能不想将所有业务逻辑都塞进去。
【讨论】:
我同意不要把我所有的鸡蛋都放进 Rolify 篮子里。我刚刚阅读了 STI(单表继承),它现在似乎已经解决了我的问题。它负责单个登录页面并根据我在控制台中看到的设置角色。我确实喜欢自我参照关系的想法,但老实说,我仍然在弄清楚这些关联并且不太精通那里,所以我可能不得不对此进行一些试验,但我相信我很快就会遇到一些事情,但谢谢供您参考!以上是关于使用 Rolify/Devise/Cancancan 与角色关联的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)