ssc*_*rus 6 ruby-on-rails query-optimization cancan ruby-on-rails-3
我有一个很大的能力文件,可以通过搜索"角色"表来确定用户可以做些什么.每个角色对应于特定用户可以执行的操作,例如,能够添加项目或能够编辑主公司记录.
目前,每个运行的控制器操作load_and_authorize_resource都会经过> 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
Run Code Online (Sandbox Code Playgroud)
这是一个非常低效的解决方案,因为服务器在执行任何操作之前运行> 30个查询.
执行此操作的最佳方法是仅根据控制器和视图所需的内容运行需要运行的查询.有没有办法做到这一点?
这在一定程度上是您编写角色测试的方式。而不是写入 > 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
Run Code Online (Sandbox Code Playgroud)
您可以一次查询所有用户角色:
@user_roles = user.roles.all
Run Code Online (Sandbox Code Playgroud)
然后分别测试每个角色:
can :destroy, Task if @user_roles.detect {|u| u["role"] == "delete" && u["roleable_type"]=="task" }
Run Code Online (Sandbox Code Playgroud)
由于所有角色都在单个查询中读入内存,因此您没有 30 个查询。
| 归档时间: |
|
| 查看次数: |
899 次 |
| 最近记录: |