Browse Source

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
tags/2.4.0
Jean-Philippe Lang 11 years ago
parent
commit
6803d95a32
2 changed files with 39 additions and 1 deletions
  1. 13
    1
      app/models/user.rb
  2. 26
    0
      test/unit/user_test.rb

+ 13
- 1
app/models/user.rb View File

@@ -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

+ 26
- 0
test/unit/user_test.rb View File

@@ -762,6 +762,32 @@ class UserTest < ActiveSupport::TestCase
assert_equal true, User.default_admin_account_changed?
end

def test_membership_with_project_should_return_membership
project = Project.find(1)

membership = @jsmith.membership(project)
assert_kind_of Member, membership
assert_equal @jsmith, membership.user
assert_equal project, membership.project
end

def test_membership_with_project_id_should_return_membership
project = Project.find(1)

membership = @jsmith.membership(1)
assert_kind_of Member, membership
assert_equal @jsmith, membership.user
assert_equal project, membership.project
end

def test_membership_for_non_member_should_return_nil
project = Project.find(1)

user = User.generate!
membership = user.membership(1)
assert_nil membership
end

def test_roles_for_project
# user with a role
roles = @jsmith.roles_for_project(Project.find(1))

Loading…
Cancel
Save