1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

cache_key consults updated_on timestamp if present

- Extract max timestamp retrieval for cache_key
- Update changelog for cache_key changes
This commit is contained in:
Brendon Murphy 2013-01-23 01:47:23 -08:00
parent 92aa789ce1
commit 1dc98c143c
5 changed files with 39 additions and 3 deletions

View file

@ -1,3 +1,13 @@
* Expand `#cache_key` to consult all relevant updated timestamps.
Previously only `updated_at` column was checked, now it will
consult other columns that received updated timestamps on save,
such as `updated_on`. When multiple columns are present it will
use the most recent timestamp.
Fixes #9033.
*Brendon Murphy*
## Rails 4.0.0.beta1 (February 25, 2013) ## ## Rails 4.0.0.beta1 (February 25, 2013) ##
* Fix overriding of attributes by default_scope on `ActiveRecord::Base#dup`. * Fix overriding of attributes by default_scope on `ActiveRecord::Base#dup`.

View file

@ -49,7 +49,7 @@ module ActiveRecord
case case
when new_record? when new_record?
"#{self.class.model_name.cache_key}/new" "#{self.class.model_name.cache_key}/new"
when timestamp = self[:updated_at] when timestamp = max_updated_column_timestamp
timestamp = timestamp.utc.to_s(cache_timestamp_format) timestamp = timestamp.utc.to_s(cache_timestamp_format)
"#{self.class.model_name.cache_key}/#{id}-#{timestamp}" "#{self.class.model_name.cache_key}/#{id}-#{timestamp}"
else else

View file

@ -98,6 +98,12 @@ module ActiveRecord
timestamp_attributes_for_create + timestamp_attributes_for_update timestamp_attributes_for_create + timestamp_attributes_for_update
end end
def max_updated_column_timestamp
if (timestamps = timestamp_attributes_for_update.map { |attr| self[attr] }.compact).present?
timestamps.map { |ts| ts.to_time }.max
end
end
def current_time_from_proper_timezone def current_time_from_proper_timezone
self.class.default_timezone == :utc ? Time.now.utc : Time.now self.class.default_timezone == :utc ? Time.now.utc : Time.now
end end

View file

@ -1441,12 +1441,30 @@ class BasicsTest < ActiveRecord::TestCase
assert_not_equal key, car.cache_key assert_not_equal key, car.cache_key
end end
def test_cache_key_format_for_existing_record_with_nil_updated_at def test_cache_key_format_for_existing_record_with_nil_updated_timestamps
dev = Developer.first dev = Developer.first
dev.update_columns(updated_at: nil) dev.update_columns(updated_at: nil, updated_on: nil)
assert_match(/\/#{dev.id}$/, dev.cache_key) assert_match(/\/#{dev.id}$/, dev.cache_key)
end end
def test_cache_key_for_updated_on
dev = Developer.first
dev.updated_at = nil
assert_equal "developers/#{dev.id}-#{dev.updated_on.utc.to_s(:nsec)}", dev.cache_key
end
def test_cache_key_for_newer_updated_at
dev = Developer.first
dev.updated_at += 3600
assert_equal "developers/#{dev.id}-#{dev.updated_at.utc.to_s(:nsec)}", dev.cache_key
end
def test_cache_key_for_newer_updated_on
dev = Developer.first
dev.updated_on += 3600
assert_equal "developers/#{dev.id}-#{dev.updated_on.utc.to_s(:nsec)}", dev.cache_key
end
def test_touch_should_raise_error_on_a_new_object def test_touch_should_raise_error_on_a_new_object
company = Company.new(:rating => 1, :name => "37signals", :firm_name => "37signals") company = Company.new(:rating => 1, :name => "37signals", :firm_name => "37signals")
assert_raises(ActiveRecord::ActiveRecordError) do assert_raises(ActiveRecord::ActiveRecordError) do

View file

@ -219,6 +219,8 @@ ActiveRecord::Schema.define do
t.integer :salary, :default => 70000 t.integer :salary, :default => 70000
t.datetime :created_at t.datetime :created_at
t.datetime :updated_at t.datetime :updated_at
t.datetime :created_on
t.datetime :updated_on
end end
create_table :developers_projects, :force => true, :id => false do |t| create_table :developers_projects, :force => true, :id => false do |t|