From a54b2e80f80d94bd903df85ac31dc2fd57cd97d0 Mon Sep 17 00:00:00 2001 From: Jakub Jirutka Date: Sun, 30 Dec 2012 18:54:02 +0100 Subject: [PATCH] Optimize query for keys of repository members MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …to load them at once and then use query cache. --- app/roles/authority.rb | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/app/roles/authority.rb b/app/roles/authority.rb index 5e0d61c3..77278489 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)