Commit a54b2e80f80d94bd903df85ac31dc2fd57cd97d0
1 parent
82ae973a
Exists in
master
and in
4 other branches
Optimize query for keys of repository members
…to load them at once and then use query cache.
Showing
1 changed file
with
13 additions
and
9 deletions
Show diff stats
app/roles/authority.rb
| ... | ... | @@ -25,21 +25,25 @@ module Authority |
| 25 | 25 | end |
| 26 | 26 | |
| 27 | 27 | def repository_readers |
| 28 | - keys = Key.joins({user: :users_projects}). | |
| 29 | - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::REPORTER) | |
| 30 | - keys.map(&:identifier) + deploy_keys.map(&:identifier) | |
| 28 | + repository_members[UsersProject::REPORTER] | |
| 31 | 29 | end |
| 32 | 30 | |
| 33 | 31 | def repository_writers |
| 34 | - keys = Key.joins({user: :users_projects}). | |
| 35 | - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::DEVELOPER) | |
| 36 | - keys.map(&:identifier) | |
| 32 | + repository_members[UsersProject::DEVELOPER] | |
| 37 | 33 | end |
| 38 | 34 | |
| 39 | 35 | def repository_masters |
| 40 | - keys = Key.joins({user: :users_projects}). | |
| 41 | - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::MASTER) | |
| 42 | - keys.map(&:identifier) | |
| 36 | + repository_members[UsersProject::MASTER] | |
| 37 | + end | |
| 38 | + | |
| 39 | + def repository_members | |
| 40 | + keys = Hash.new {|h,k| h[k] = [] } | |
| 41 | + UsersProject.select("keys.identifier, project_access"). | |
| 42 | + joins(user: :keys).where(project_id: id). | |
| 43 | + each {|row| keys[row.project_access] << [row.identifier] } | |
| 44 | + | |
| 45 | + keys[UsersProject::REPORTER] += deploy_keys.pluck(:identifier) | |
| 46 | + keys | |
| 43 | 47 | end |
| 44 | 48 | |
| 45 | 49 | def allow_read_for?(user) | ... | ... |