mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Avoid extra touch queries when counter cache is updated
Since counter cache handles touch option too.
This commit is contained in:
parent
688c27c894
commit
1930d22936
2 changed files with 16 additions and 6 deletions
|
@ -81,12 +81,18 @@ module ActiveRecord::Associations::Builder # :nodoc:
|
||||||
BelongsTo.touch_record(record, record.send(changes_method), foreign_key, n, touch, belongs_to_touch_method)
|
BelongsTo.touch_record(record, record.send(changes_method), foreign_key, n, touch, belongs_to_touch_method)
|
||||||
}}
|
}}
|
||||||
|
|
||||||
unless reflection.counter_cache_column
|
if reflection.counter_cache_column
|
||||||
|
touch_callback = callback.(:saved_changes)
|
||||||
|
update_callback = lambda { |record|
|
||||||
|
instance_exec(record, &touch_callback) unless association(reflection.name).target_changed?
|
||||||
|
}
|
||||||
|
model.after_update update_callback, if: :saved_changes?
|
||||||
|
else
|
||||||
model.after_create callback.(:saved_changes), if: :saved_changes?
|
model.after_create callback.(:saved_changes), if: :saved_changes?
|
||||||
|
model.after_update callback.(:saved_changes), if: :saved_changes?
|
||||||
model.after_destroy callback.(:changes_to_save)
|
model.after_destroy callback.(:changes_to_save)
|
||||||
end
|
end
|
||||||
|
|
||||||
model.after_update callback.(:saved_changes), if: :saved_changes?
|
|
||||||
model.after_touch callback.(:changes_to_save)
|
model.after_touch callback.(:changes_to_save)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -616,8 +616,10 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
||||||
debate.touch(time: time)
|
debate.touch(time: time)
|
||||||
debate2.touch(time: time)
|
debate2.touch(time: time)
|
||||||
|
|
||||||
reply.parent_title = "debate"
|
assert_queries(3) do
|
||||||
reply.save!
|
reply.parent_title = "debate"
|
||||||
|
reply.save!
|
||||||
|
end
|
||||||
|
|
||||||
assert_operator debate.reload.updated_at, :>, time
|
assert_operator debate.reload.updated_at, :>, time
|
||||||
assert_operator debate2.reload.updated_at, :>, time
|
assert_operator debate2.reload.updated_at, :>, time
|
||||||
|
@ -625,8 +627,10 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
|
||||||
debate.touch(time: time)
|
debate.touch(time: time)
|
||||||
debate2.touch(time: time)
|
debate2.touch(time: time)
|
||||||
|
|
||||||
reply.topic_with_primary_key = debate2
|
assert_queries(3) do
|
||||||
reply.save!
|
reply.topic_with_primary_key = debate2
|
||||||
|
reply.save!
|
||||||
|
end
|
||||||
|
|
||||||
assert_operator debate.reload.updated_at, :>, time
|
assert_operator debate.reload.updated_at, :>, time
|
||||||
assert_operator debate2.reload.updated_at, :>, time
|
assert_operator debate2.reload.updated_at, :>, time
|
||||||
|
|
Loading…
Reference in a new issue