提交 1930d229 编写于 作者: R Ryuta Kamizono

Avoid extra touch queries when counter cache is updated

Since counter cache handles touch option too.
上级 688c27c8
......@@ -81,12 +81,18 @@ def self.add_touch_callbacks(model, reflection)
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_update callback.(:saved_changes), if: :saved_changes?
model.after_destroy callback.(:changes_to_save)
end
model.after_update callback.(:saved_changes), if: :saved_changes?
model.after_touch callback.(:changes_to_save)
end
......
......@@ -616,8 +616,10 @@ def test_belongs_to_touch_with_reassigning
debate.touch(time: time)
debate2.touch(time: time)
reply.parent_title = "debate"
reply.save!
assert_queries(3) do
reply.parent_title = "debate"
reply.save!
end
assert_operator debate.reload.updated_at, :>, time
assert_operator debate2.reload.updated_at, :>, time
......@@ -625,8 +627,10 @@ def test_belongs_to_touch_with_reassigning
debate.touch(time: time)
debate2.touch(time: time)
reply.topic_with_primary_key = debate2
reply.save!
assert_queries(3) do
reply.topic_with_primary_key = debate2
reply.save!
end
assert_operator debate.reload.updated_at, :>, time
assert_operator debate2.reload.updated_at, :>, time
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册