aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorKasper Timm Hansen <kaspth@gmail.com>2016-12-31 18:45:52 +0100
committerKasper Timm Hansen <kaspth@gmail.com>2017-01-01 18:34:50 +0100
commit19deeb08df6279a9cbf0c65548641776c0451471 (patch)
treed069c7893d2bd3d0a21d0c5b9d2058b1ec11d089 /activerecord/lib
parentbf77e641ce807857fcf804250c4f8ce817ae66be (diff)
downloadrails-19deeb08df6279a9cbf0c65548641776c0451471.tar.gz
rails-19deeb08df6279a9cbf0c65548641776c0451471.tar.bz2
rails-19deeb08df6279a9cbf0c65548641776c0451471.zip
Fix tests with counter cache touching and more.
* Refactor to use `touch_updates` Ensures we only call `current_time_from_proper_timezone` from one place. * Clarify touch default in tests. Not interested in what happens when passed false but that nothing passed means no touching. * Backdate touched columns in tests. We can't be sure a test progresses through time, so our touching code may be working correctly but the test itself is brittle. Fix by backdating that's further in the past akin to what the timestamps tests do: https://github.com/rails/rails/blob/d753645d40e925973724e4c3a8617b654da90e41/activerecord/test/cases/timestamp_test.rb#L17 * Expand changelog entry. Elaborate and show examples. Closes #26995. [ Jarred Trost & Kasper Timm Hansen ]
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/counter_cache.rb28
1 files changed, 10 insertions, 18 deletions
diff --git a/activerecord/lib/active_record/counter_cache.rb b/activerecord/lib/active_record/counter_cache.rb
index af29b4c5bb..9355a2f7a7 100644
--- a/activerecord/lib/active_record/counter_cache.rb
+++ b/activerecord/lib/active_record/counter_cache.rb
@@ -47,12 +47,9 @@ module ActiveRecord
updates = { counter_name.to_sym => object.send(counter_association).count(:all) }
- touch_time = object.send(:current_time_from_proper_timezone)
- resolve_timestamp_columns(object, touch).each do |column|
- updates[column] = touch_time
- end
-
- unscoped.where(primary_key => object.id).update_all(updates)
+ unscoped.where(primary_key => object.id).update_all(
+ updates.merge(touch_updates(object, touch))
+ )
end
return true
end
@@ -109,10 +106,7 @@ module ActiveRecord
if touch
object = find(id)
- touch_time = object.send(:current_time_from_proper_timezone)
- timestamps = resolve_timestamp_columns(object, touch)
-
- timestamps.map do |column|
+ touch_updates(object, touch).map do |column, touch_time|
updates << "#{connection.quote_column_name(column.to_s)} = #{connection.quote(touch_time)}"
end
end
@@ -144,7 +138,7 @@ module ActiveRecord
# # and update the updated_at value.
# DiscussionBoard.increment_counter(:posts_count, 5, touch: true)
def increment_counter(counter_name, id, touch: nil)
- update_counters(id, { counter_name => 1 }.merge(touch: touch))
+ update_counters(id, counter_name => 1, touch: touch)
end
# Decrement a numeric field by one, via a direct SQL update.
@@ -169,16 +163,14 @@ module ActiveRecord
# # and update the updated_at value.
# DiscussionBoard.decrement_counter(:posts_count, 5, touch: true)
def decrement_counter(counter_name, id, touch: nil)
- update_counters(id, { counter_name => -1 }.merge(touch: touch))
+ update_counters(id, counter_name => -1, touch: touch)
end
private
- def resolve_timestamp_columns(object, touch)
- if touch == true
- object.send(:timestamp_attributes_for_update_in_model)
- else
- Array(touch)
- end
+ def touch_updates(object, touch)
+ touch = object.send(:timestamp_attributes_for_update_in_model) if touch == true
+ touch_time = object.send(:current_time_from_proper_timezone)
+ Array(touch).map { |column| [ column, touch_time ] }.to_h
end
end