diff options
author | Kasper Timm Hansen <kaspth@gmail.com> | 2016-12-31 18:45:52 +0100 |
---|---|---|
committer | Kasper Timm Hansen <kaspth@gmail.com> | 2017-01-01 18:34:50 +0100 |
commit | 19deeb08df6279a9cbf0c65548641776c0451471 (patch) | |
tree | d069c7893d2bd3d0a21d0c5b9d2058b1ec11d089 /activerecord/lib | |
parent | bf77e641ce807857fcf804250c4f8ce817ae66be (diff) | |
download | rails-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.rb | 28 |
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 |