summaryrefslogtreecommitdiffstats
path: root/app/models/user.rb
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2013-03-01 10:24:23 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2013-03-01 10:24:23 +0000
commit6803d95a32ab15fcb1f7b34f00ace445166fe882 (patch)
treee1b28d5d9fe2378f5ebb9b4896a7e633e26f8fed /app/models/user.rb
parent69657be5348e989d5b5401c08fc473a793cdc55c (diff)
downloadredmine-6803d95a32ab15fcb1f7b34f00ace445166fe882.tar.gz
redmine-6803d95a32ab15fcb1f7b34f00ace445166fe882.zip
Performance: avoid querying all memberships in User#roles_for_project (#13301).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11508 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/user.rb')
-rw-r--r--app/models/user.rb14
1 files changed, 13 insertions, 1 deletions
diff --git a/app/models/user.rb b/app/models/user.rb
index 39533d0b7..4c490dc44 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -132,6 +132,7 @@ class User < Principal
def reload(*args)
@name = nil
@projects_by_role = nil
+ @membership_by_project_id = nil
base_reload(*args)
end
@@ -419,6 +420,17 @@ class User < Principal
!logged?
end
+ # Returns user's membership for the given project
+ # or nil if the user is not a member of project
+ def membership(project)
+ project_id = project.is_a?(Project) ? project.id : project
+
+ @membership_by_project_id ||= Hash.new {|h, project_id|
+ h[project_id] = memberships.where(:project_id => project_id).first
+ }
+ @membership_by_project_id[project_id]
+ end
+
# Return user's roles for project
def roles_for_project(project)
roles = []
@@ -426,7 +438,7 @@ class User < Principal
return roles if project.nil? || project.archived?
if logged?
# Find project membership
- membership = memberships.detect {|m| m.project_id == project.id}
+ membership = membership(project)
if membership
roles = membership.roles
else