From b177427d977b21cb18d2eca688539565e8970324 Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Tue, 3 Jan 2017 01:40:04 +0900 Subject: Fix update counters of multiple records with touch: true Currently does not work the following example in the doc: ```ruby # For the Posts with id of 10 and 15, increment the comment_count by 1 # and update the updated_at value for each counter. Post.update_counters [10, 15], comment_count: 1, touch: true # Executes the following SQL: # UPDATE posts # SET comment_count = COALESCE(comment_count, 0) + 1, # `updated_at` = '2016-10-13T09:59:23-05:00' # WHERE id IN (10, 15) ``` --- activerecord/lib/active_record/counter_cache.rb | 2 +- activerecord/test/cases/counter_cache_test.rb | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/counter_cache.rb b/activerecord/lib/active_record/counter_cache.rb index c654d4703a..f4ee008a12 100644 --- a/activerecord/lib/active_record/counter_cache.rb +++ b/activerecord/lib/active_record/counter_cache.rb @@ -105,7 +105,7 @@ module ActiveRecord end if touch - object = find(id) + object = find(id.is_a?(Array) ? id.first : id) updates << object.class.send(:sanitize_sql_for_assignment, touch_updates(object, touch)) end diff --git a/activerecord/test/cases/counter_cache_test.rb b/activerecord/test/cases/counter_cache_test.rb index c735e13715..c7d0ba32b4 100644 --- a/activerecord/test/cases/counter_cache_test.rb +++ b/activerecord/test/cases/counter_cache_test.rb @@ -227,6 +227,16 @@ class CounterCacheTest < ActiveRecord::TestCase end end + test "update counters of multiple records with touch: true" do + t1, t2 = topics(:first, :second) + + assert_touching t1, :updated_at do + assert_difference ["t1.reload.replies_count", "t2.reload.replies_count"], 2 do + Topic.update_counters([t1.id, t2.id], replies_count: 2, touch: true) + end + end + end + test "update multiple counters with touch: true" do assert_touching @topic, :updated_at do Topic.update_counters(@topic.id, replies_count: 2, unique_replies_count: 2, touch: true) -- cgit v1.2.3