我正面临着挑战。一个多层次的授权系统和一个朋友告诉我,cancancan可以帮到我。
我读了一遍文档,但搞不懂。所以我在这里解释。我的目标是创建一个sys:
也是
现在,每个用户只能看到自己创建的记录,或者是来自低于,但不是以上或来自其他部门的用户的记录。
我该怎么从模特和一切开始呢?
发布于 2019-07-28 12:21:23
首先,您需要在数据库级别跟踪此树。为此,可以向users表添加一个users引用,该表将引用创建该特定用户的用户。对于未由任何人创建的用户,此列将为空,否则将保存父用户的id。为了保证引用的完整性,我强烈建议使用外键。
然后,您将需要以正确遍历树结构的方式定义您的CanCanCan能力。您可以将从医生们派生的这个示例作为参考
class Ability
def initialize(user)
can :read, Photo, Book do |resource|
resource.creator.descendant_of? user
end
end
end假设User模型有一个descendant_of?方法,它从当前用户遍历树到根,检查给定用户是否是资源创建者的父级。可能的实现如下所示:
# app/models/user.rb
def descendant_of?(target_user)
parent_id == target_user.id || parent&.descendant_of?(target_user)
end根据用户树的特性,该建议在效率方面可能很快就会变差,因为从所有者到根的所有用户都可能从数据库加载以执行这些检查。这里有几个想法是值得探讨的,以防你开始面对这些问题:
parent_ids列使用类似数组的类型来存储父ids的整个列表。我在这个建议中看到的主要缺点是,如果树中有更改,并且引用完整性约束丢失,它会增加一些开销(AFAIK在此场景中不可能添加外键)。https://stackoverflow.com/questions/57234297
复制相似问题