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:
parent
92aa789ce1
commit
1dc98c143c
5 changed files with 39 additions and 3 deletions
|
@ -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`.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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|
|
||||||
|
|
Loading…
Reference in a new issue