gpt4 book ai didi

ruby-on-rails - Rails Eager 加载 CanCan 角色

转载 作者:行者123 更新时间:2023-12-04 05:49:09 25 4
gpt4 key购买 nike

我试图通过急切加载一些 sql 调用来加速我的应用程序。我正在使用 CanCan gem 来处理我的管理员授权。我有一个包含三个不同角色的 Roles 表和一个多对多表 roles_users。每次使用 CanCan 功能集加载页面时,它都会执行三个单独的 sql 查询。

 Role Load (0.6ms)  SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles"."id"    
= "roles_users"."role_id" WHERE "roles_users"."user_id" = 2 AND "roles"."name" = 'admin'
LIMIT 1
Role Load (0.4ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles"."id"
= "roles_users"."role_id" WHERE "roles_users"."user_id" = 2 AND "roles"."name" =
'manager' LIMIT 1
Role Load (0.3ms) SELECT "roles".* FROM "roles" INNER JOIN "roles_users" ON "roles"."id"
= "roles_users"."role_id" WHERE "roles_users"."user_id" = 2 AND "roles"."name" = 'user'
LIMIT 1

我试过在 User 类中放置一个 default_scope :include => :roles 并在 has_and_belongs_to_many 调用中放置 :includes 。

我在哪里可以急切加载 Roles 表以仅使用 1 个 SQL 查询?

最佳答案

看起来您可能有一些如下所示的代码。也就是说,它需要一个字符串或符号来与角色记录中的某个值进行比较,而不是角色本身。所以寻找这样的东西:

def do_i_have_role(role_name_to_check)
self.roles.detect do |role|
role.name == role_name_to_check
end
end

您可以在此处进行一些急切加载来修复它,但另一种剥皮这只猫的方法是重构您的查询。即先查找角色对象,然后查看您的帐户是否具有该角色。
def do_i_have_role(role_name_to_check)
role = Role.where(:name => role_name_to_check)
self.roles.include? role
end

现在它只是对角色数据库的一次命中,而不是 3 次(对accounts 表的一次命中和对 account_user 表的一次命中,您可能永远无法避免)。

关于ruby-on-rails - Rails Eager 加载 CanCan 角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10291555/

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