diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2017-01-03 01:40:04 +0900 |
---|---|---|
committer | Ryuta Kamizono <kamipo@gmail.com> | 2017-01-03 01:40:04 +0900 |
commit | b177427d977b21cb18d2eca688539565e8970324 (patch) | |
tree | cde6f525b99605e8e20902f9356163ec3de99e25 | |
parent | 4a36d81385bb78064fd3ebe0b35c9430017f7971 (diff) | |
download | rails-b177427d977b21cb18d2eca688539565e8970324.tar.gz rails-b177427d977b21cb18d2eca688539565e8970324.tar.bz2 rails-b177427d977b21cb18d2eca688539565e8970324.zip |
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)
```
-rw-r--r-- | activerecord/lib/active_record/counter_cache.rb | 2 | ||||
-rw-r--r-- | activerecord/test/cases/counter_cache_test.rb | 10 |
2 files changed, 11 insertions, 1 deletions
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) |