aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorKasper Timm Hansen <kaspth@gmail.com>2019-07-31 06:31:50 +0200
committerGitHub <noreply@github.com>2019-07-31 06:31:50 +0200
commit40fc31c103a92cdfe335066869a54a6961c485ac (patch)
tree60ecb9f184cc576b71e5c71d5bebb19e983b859c /activerecord/lib
parent151a39c4f26f30e4b53a6f5f1586f32ab72a4ba4 (diff)
parentcea392eb9683fe5545c968817e039c72c69fd3f9 (diff)
downloadrails-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.rb4
-rw-r--r--activerecord/lib/active_record/associations/builder/has_one.rb19
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