diff options
author | Kasper Timm Hansen <kaspth@gmail.com> | 2019-07-31 06:31:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-31 06:31:50 +0200 |
commit | 40fc31c103a92cdfe335066869a54a6961c485ac (patch) | |
tree | 60ecb9f184cc576b71e5c71d5bebb19e983b859c /activerecord/lib | |
parent | 151a39c4f26f30e4b53a6f5f1586f32ab72a4ba4 (diff) | |
parent | cea392eb9683fe5545c968817e039c72c69fd3f9 (diff) | |
download | rails-40fc31c103a92cdfe335066869a54a6961c485ac.tar.gz rails-40fc31c103a92cdfe335066869a54a6961c485ac.tar.bz2 rails-40fc31c103a92cdfe335066869a54a6961c485ac.zip |
Merge pull request #36708 from rails/has-one-polymorphic-touch-dont-cache-association-result-inside-create-transaction
Polymorphic has_one touch: Don't cache association result inside crea…
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record/associations/association.rb | 4 | ||||
-rw-r--r-- | activerecord/lib/active_record/associations/builder/has_one.rb | 19 |
2 files changed, 11 insertions, 12 deletions
diff --git a/activerecord/lib/active_record/associations/association.rb b/activerecord/lib/active_record/associations/association.rb index cf22b850b9..705a5571ee 100644 --- a/activerecord/lib/active_record/associations/association.rb +++ b/activerecord/lib/active_record/associations/association.rb @@ -56,6 +56,10 @@ module ActiveRecord @inversed = false end + def reset_negative_cache # :nodoc: + reset if loaded? && target.nil? + end + # Reloads the \target and returns +self+ on success. # The QueryCache is cleared if +force+ is true. def reload(force = false) diff --git a/activerecord/lib/active_record/associations/builder/has_one.rb b/activerecord/lib/active_record/associations/builder/has_one.rb index 27ebe8cb71..db8393930e 100644 --- a/activerecord/lib/active_record/associations/builder/has_one.rb +++ b/activerecord/lib/active_record/associations/builder/has_one.rb @@ -32,15 +32,12 @@ module ActiveRecord::Associations::Builder # :nodoc: end end - def self.touch_record(o, name, touch) - record = o.send name + def self.touch_record(record, name, touch) + instance = record.send(name) - return unless record && record.persisted? - - if touch != true - record.touch(touch) - else - record.touch + if instance&.persisted? + touch != true ? + instance.touch(touch) : instance.touch end end @@ -48,11 +45,9 @@ module ActiveRecord::Associations::Builder # :nodoc: name = reflection.name touch = reflection.options[:touch] - callback = lambda { |record| - HasOne.touch_record(record, name, touch) - } - + callback = -> (record) { HasOne.touch_record(record, name, touch) } model.after_create callback, if: :saved_changes? + model.after_create_commit { association(name).reset_negative_cache } model.after_update callback, if: :saved_changes? model.after_destroy callback model.after_touch callback |