Actions
Bug #39335
openN+1 queries when authorizer loads filters, filterings and permissions
Description
Steps to reproduce:
1. Have a non-admin user (admins skip authorization entirely via return all if user.admin?)
2. Give the user multiple roles with filters granting permissions on the same resource type (e.g. several roles each with view_job_templates on JobTemplate)
3. Call .authorized(<permission_name>) on that resource — the authorizer loads all matching filters, then iterates them
The count scales with the number of matching filters, so more roles with overlapping permissions on the same resource = more N+1 queries.
> JobTemplate.authorized(:view_job_templates) -----B<-----SNIP-----B<----- 2026-05-19T15:16:33 [D|per|] filter with role_id: 17 limited: false search: taxonomy_search: | filter with role_id: 18 limited: false search: taxonomy_search: | filter with role_id: 2 limited: false search: taxonomy_search: | filter with role_id: 3 limited: false search: taxonomy_search: | filter with role_id: 8 limited: false search: taxonomy_search: | filter with role_id: 9 limited: false search: taxonomy_search: | filter with role_id: 21 limited: false search: taxonomy_search: 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.4ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 230], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.4ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.3ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 230], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.4ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 237], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.4ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 237], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.4ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 241], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.3ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 241], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.3ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 245], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.3ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 245], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.3ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 249], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.3ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 249], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.3ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 253], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.4ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 253], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.3ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 265], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Filtering Load (0.3ms) SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2 [["filter_id", 265], ["LIMIT", 1]] 2026-05-19T15:16:33 [D|sql|] Permission Load (0.3ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2 [["id", 169], ["LIMIT", 1]] -----B<-----SNIP-----B<-----
No data to display
Actions