diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2017-04-02 08:24:23 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2017-04-21 07:20:52 +0900 |
commit | c0038f7c362fa0c92fc9e1ea3bdb2706f42386c6 (patch) | |
tree | 0713cb06b1f2be74776d0b52c88ac89b2e3acbf8 /activerecord/lib/active_record/associations/has_many_through_association.rb | |
parent | 972df059bbedfe60d29caa8a561f5aff76883e63 (diff) | |
download | rails-c0038f7c362fa0c92fc9e1ea3bdb2706f42386c6.tar.gz rails-c0038f7c362fa0c92fc9e1ea3bdb2706f42386c6.tar.bz2 rails-c0038f7c362fa0c92fc9e1ea3bdb2706f42386c6.zip |
Prevent double firing the before save callback of new object when the parent association saved in the callback
Related #18155, #26661, 268a5bb, #27434, #27442, and #28599.
Originally #18155 was introduced for preventing double insertion caused
by the after save callback. But it was caused the before save issue
(#26661). 268a5bb fixed #26661, but it was caused the performance
regression (#27434). #27442 added new record to `target` before calling
callbacks for fixing #27434. But it was caused double firing before save
callback (#28599). We cannot add new object to `target` before saving
the object.
This is improving #18155 to only track callbacks after `save`.
Fixes #28599.
Diffstat (limited to 'activerecord/lib/active_record/associations/has_many_through_association.rb')
-rw-r--r-- | activerecord/lib/active_record/associations/has_many_through_association.rb | 6 |
1 files changed, 1 insertions, 5 deletions
diff --git a/activerecord/lib/active_record/associations/has_many_through_association.rb b/activerecord/lib/active_record/associations/has_many_through_association.rb index c4a7fe4432..53ffb3b68d 100644 --- a/activerecord/lib/active_record/associations/has_many_through_association.rb +++ b/activerecord/lib/active_record/associations/has_many_through_association.rb @@ -39,11 +39,7 @@ module ActiveRecord ensure_not_nested if record.new_record? || record.has_changes_to_save? - if raise - record.save!(validate: validate) - else - return unless record.save(validate: validate) - end + return unless super end save_through_record(record) |