提交 efb41c6a 编写于 作者: R Rafael Mendonça França

Merge pull request #15728 from sgrif/sg-double-save-hm-t

Don't save through records twice

Conflicts:
	activerecord/CHANGELOG.md
	activerecord/test/cases/associations/has_many_through_associations_test.rb
* `has_many :through` associations will no longer save the through record
twice when added in an `after_create` callback defined before the
associations.
Fixes #3798.
*Sean Griffin*
* Detect in-place modifications of PG array types
*Sean Griffin*
......
......@@ -184,9 +184,7 @@ def add_autosave_association_callbacks(reflection)
before_save :before_save_collection_association
define_non_cyclic_method(save_method) { save_collection_association(reflection) }
# Doesn't use after_save as that would save associations added in after_create/after_update twice
after_create save_method
after_update save_method
after_save save_method
elsif reflection.has_one?
define_method(save_method) { save_has_one_association(reflection) } unless method_defined?(save_method)
# Configures two callbacks instead of a single after_save so that
......@@ -364,6 +362,7 @@ def save_collection_association(reflection)
raise ActiveRecord::Rollback unless saved
end
@new_record_before_save = false
end
# reconstruct the scope now that we know the owner's id
......
......@@ -1139,7 +1139,7 @@ def test_has_many_through_unscope_default_scope
assert_equal 2, post.lazy_readers_unscope_skimmers.to_a.size
assert_equal 2, post.lazy_people_unscope_skimmers.to_a.size
end
def test_has_many_through_add_with_sti_middle_relation
club = SuperClub.create!(name: 'Fight Club')
member = Member.create!(name: 'Tyler Durden')
......@@ -1147,4 +1147,23 @@ def test_has_many_through_add_with_sti_middle_relation
club.members << member
assert_equal 1, SuperMembership.where(member_id: member.id, club_id: club.id).count
end
class ClubWithCallbacks < ActiveRecord::Base
self.table_name = 'clubs'
after_create :add_a_member
has_many :memberships, inverse_of: :club, foreign_key: :club_id
has_many :members, through: :memberships
def add_a_member
members << Member.last
end
end
def test_has_many_with_callback_before_association
Member.create!
club = ClubWithCallbacks.create!
assert_equal 1, club.reload.memberships.count
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册