mirror of
https://github.com/meineerde/redmine.git
synced 2026-01-02 21:59:39 +00:00
Fixed that Member#destroy triggers after_destroy callbacks twice (#16795).
git-svn-id: http://svn.redmine.org/redmine/trunk@13140 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
1914d1a159
commit
1fd5346c3c
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user