Optimize performance of permission_granted check [SCI-12350]

This commit is contained in:
Oleksii Kriuchykhin 2025-09-10 11:27:13 +02:00
parent fc51e4acc9
commit 07e3cc23af

View file

@ -49,10 +49,15 @@ module PermissionCheckableModel
.exists?(['user_roles.permissions @> ARRAY[?]::varchar[]', [permission]]) .exists?(['user_roles.permissions @> ARRAY[?]::varchar[]', [permission]])
end end
user_roles = UserRole.left_outer_joins(:team_assignments, user_group_assignments: { user_group: :users }) team_roles = UserRole.joins(:team_assignments)
user_roles.where(user_group_assignments: { assignable: self, user_groups: { users: user }, team: permission_team }) .where(team_assignments: { assignable: self, team: permission_team })
.or(user_roles.where(team_assignments: { assignable: self, team: permission_team })) group_roles = UserRole.joins(user_group_assignments: { user_group: :users })
.exists?(['user_roles.permissions @> ARRAY[?]::varchar[]', [permission]]) .where(user_group_assignments: { assignable: self, user_groups: { users: user }, team: permission_team })
UserRole.from(
"(#{team_roles.to_sql} UNION #{group_roles.to_sql}) AS user_roles",
:user_roles
).exists?(['user_roles.permissions @> ARRAY[?]::varchar[]', [permission]])
end end
def readable_by_user?(user) def readable_by_user?(user)