gpt4 book ai didi

ruby-on-rails - 减少cancan中的ability.rb负载

转载 作者:行者123 更新时间:2023-12-04 15:25:55 24 4
gpt4 key购买 nike

我有一个很大的能力文件,它通过从“角色”表中搜索来决定用户可以做什么。每个角色对应于特定用户可以执行的操作,例如,能够添加项目或能够编辑主要公司记录。

目前,运行 load_and_authorize_resource 的每个 Controller 操作经历超过 30 条语句,例如:

ability.rb (>30 times)
Role.where("user_id = ? AND role = ? AND roleable_type = ? AND roleable_id IS NULL", user.id, "delete", "task").last.present? ? (can :destroy, Task) : nil

这是一个非常低效的解决方案,因为服务器甚至在执行任何操作之前就运行了 30 多个查询。

执行此操作的最佳方法是仅根据 Controller 和 View 的要求运行需要运行的查询。有没有办法做到这一点?

最佳答案

这部分是您编写角色测试的方式。而不是写> 30次:

Role.where("user_id = ? AND role = ? AND roleable_type = ? AND roleable_id IS NULL", user.id, "delete", "task").last.present? ? (can :destroy, Task) : nil

您可以改为一次查询所有用户角色:
@user_roles = user.roles.all

然后对每个角色单独测试:
can :destroy, Task if @user_roles.detect {|u| u["role"] == "delete" && u["roleable_type"]=="task" }

由于所有角色都在单个查询中读入内存,因此您没有 30 个查询。

关于ruby-on-rails - 减少cancan中的ability.rb负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9144909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com