From 6aa5cf03ea8232180ffbbae4c130b051f813c670 Mon Sep 17 00:00:00 2001 From: Ryuta Kamizono Date: Fri, 23 Mar 2018 10:05:54 +0900 Subject: Fix that `touch(:updated_at)` causes multiple assignments on the column The multiple assignments was caused by 37a1dfa due to lost the `to_s` normalization for given names. Fixes #32323. --- activerecord/lib/active_record/persistence.rb | 2 +- activerecord/test/cases/timestamp_test.rb | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/persistence.rb b/activerecord/lib/active_record/persistence.rb index 6ec477c7f3..7721e6b691 100644 --- a/activerecord/lib/active_record/persistence.rb +++ b/activerecord/lib/active_record/persistence.rb @@ -658,7 +658,7 @@ module ActiveRecord end attribute_names = timestamp_attributes_for_update_in_model - attribute_names.concat(names) + attribute_names |= names.map(&:to_s) unless attribute_names.empty? affected_rows = _touch_row(attribute_names, time) diff --git a/activerecord/test/cases/timestamp_test.rb b/activerecord/test/cases/timestamp_test.rb index e95446c0a7..d9f7a81ce4 100644 --- a/activerecord/test/cases/timestamp_test.rb +++ b/activerecord/test/cases/timestamp_test.rb @@ -96,6 +96,16 @@ class TimestampTest < ActiveRecord::TestCase assert_not_equal @previously_updated_at, @developer.updated_at end + def test_touching_update_at_attribute_as_symbol_updates_timestamp + travel(1.second) do + @developer.touch(:updated_at) + end + + assert_not @developer.updated_at_changed? + assert_not @developer.changed? + assert_not_equal @previously_updated_at, @developer.updated_at + end + def test_touching_an_attribute_updates_it task = Task.first previous_value = task.ending -- cgit v1.2.3