diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2014-05-24 16:37:38 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2014-05-24 16:37:38 +0000 |
commit | 221c8392c6a4a468d0733c2902a5547792e84ac5 (patch) | |
tree | 71b51f3e7f51205fffa1a29832a210077ab02901 | |
parent | cc37898d15bd8b057961e422453a35321732816e (diff) | |
download | redmine-221c8392c6a4a468d0733c2902a5547792e84ac5.tar.gz redmine-221c8392c6a4a468d0733c2902a5547792e84ac5.zip |
Merged r13140 and r13142 (#16795).
git-svn-id: http://svn.redmine.org/redmine/branches/2.5-stable@13162 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r-- | app/models/member.rb | 12 | ||||
-rw-r--r-- | test/unit/member_test.rb | 17 |
2 files changed, 29 insertions, 0 deletions
diff --git a/app/models/member.rb b/app/models/member.rb index f8b87975e..6ec22d422 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -73,6 +73,18 @@ class Member < ActiveRecord::Base member_roles.detect {|mr| mr.inherited_from}.nil? end + def destroy + if member_roles.reload.present? + # destroying the last role will destroy another instance + # of the same Member record, #super would then trigger callbacks twice + member_roles.destroy_all + @destroyed = true + freeze + else + super + end + end + def include?(user) if principal.is_a?(Group) !user.nil? && user.groups.include?(principal) diff --git a/test/unit/member_test.rb b/test/unit/member_test.rb index 586964b52..6ba9717c4 100644 --- a/test/unit/member_test.rb +++ b/test/unit/member_test.rb @@ -107,6 +107,23 @@ class MemberTest < ActiveSupport::TestCase assert_nil category1.assigned_to_id end + def test_destroy_should_trigger_callbacks_only_once + Member.class_eval { def destroy_test_callback; end} + Member.after_destroy :destroy_test_callback + + m = Member.create!(:user_id => 1, :project_id => 1, :role_ids => [1,3]) + + Member.any_instance.expects(:destroy_test_callback).once + assert_difference 'Member.count', -1 do + assert_difference 'MemberRole.count', -2 do + m.destroy + end + end + assert m.destroyed? + ensure + Member._destroy_callbacks.reject! {|c| c.filter==:destroy_test_callback} + end + def test_sort_without_roles a = Member.new(:roles => [Role.first]) b = Member.new |