diff options
author | Stan Hu <stanhu@gmail.com> | 2016-06-28 19:02:27 +0300 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2016-06-29 13:12:57 +0300 |
commit | e21c7d37c8cd21be1489f6dd445d5efa24e94456 (patch) | |
tree | c89ab8603436945ecc62b45f2dd3dd3b51423cd8 /app | |
parent | 1023289605f075cef86833ab5c1b0e87d967f69e (diff) |
Reduce overhead and optimize ProjectTeam#max_member_access performance
The previous implementation would load the entire team member list and their
respective attributes. Now we only search for the user's specific
access level.
In gitlab-com/operations#42, this reduces the overall overhead of rendering
the issue from 28% to 20%.
First step of optimizing #19273
Diffstat (limited to 'app')
-rw-r--r-- | app/models/member.rb | 1 | ||||
-rw-r--r-- | app/models/project_team.rb | 14 |
2 files changed, 3 insertions, 12 deletions
diff --git a/app/models/member.rb b/app/models/member.rb index c74a16367db..57161397e2b 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -32,6 +32,7 @@ class Member < ActiveRecord::Base scope :request, -> { where.not(requested_at: nil) } scope :non_request, -> { where(requested_at: nil) } scope :non_pending, -> { non_request.non_invite } + scope :has_access, -> { where('access_level > 0') } scope :guests, -> { where(access_level: GUEST) } scope :reporters, -> { where(access_level: REPORTER) } diff --git a/app/models/project_team.rb b/app/models/project_team.rb index 73e736820af..0865b979ce0 100644 --- a/app/models/project_team.rb +++ b/app/models/project_team.rb @@ -137,20 +137,10 @@ class ProjectTeam def max_member_access(user_id) access = [] - project.members.non_request.each do |member| - if member.user_id == user_id - access << member.access_field if member.access_field - break - end - end + access += project.members.non_request.where(user_id: user_id).has_access.pluck(:access_level) if group - group.members.non_request.each do |member| - if member.user_id == user_id - access << member.access_field if member.access_field - break - end - end + access += group.members.non_request.where(user_id: user_id).has_access.pluck(:access_level) end if project.invited_groups.any? && project.allowed_to_share_with_group? |