diff options
author | Jakub Jirutka <jakub@jirutka.cz> | 2012-12-30 18:54:02 +0100 |
---|---|---|
committer | Jakub Jirutka <jakub@jirutka.cz> | 2012-12-30 18:54:02 +0100 |
commit | a54b2e80f80d94bd903df85ac31dc2fd57cd97d0 (patch) | |
tree | 953b33513bb34f8d17ad2beb0d0c219a19a8a5e4 | |
parent | 82ae973a9909bd82d75ce493a0a151efa0a98621 (diff) | |
download | gitlab-ce-a54b2e80f80d94bd903df85ac31dc2fd57cd97d0.tar.gz |
Optimize query for keys of repository members
…to load them at once and then use query cache.
-rw-r--r-- | app/roles/authority.rb | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/app/roles/authority.rb b/app/roles/authority.rb index 5e0d61c3e85..77278489cb1 100644 --- a/app/roles/authority.rb +++ b/app/roles/authority.rb @@ -25,21 +25,25 @@ module Authority end def repository_readers - keys = Key.joins({user: :users_projects}). - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::REPORTER) - keys.map(&:identifier) + deploy_keys.map(&:identifier) + repository_members[UsersProject::REPORTER] end def repository_writers - keys = Key.joins({user: :users_projects}). - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::DEVELOPER) - keys.map(&:identifier) + repository_members[UsersProject::DEVELOPER] end def repository_masters - keys = Key.joins({user: :users_projects}). - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::MASTER) - keys.map(&:identifier) + repository_members[UsersProject::MASTER] + end + + def repository_members + keys = Hash.new {|h,k| h[k] = [] } + UsersProject.select("keys.identifier, project_access"). + joins(user: :keys).where(project_id: id). + each {|row| keys[row.project_access] << [row.identifier] } + + keys[UsersProject::REPORTER] += deploy_keys.pluck(:identifier) + keys end def allow_read_for?(user) |