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) ##
|
||||
|
||||
* Fix overriding of attributes by default_scope on `ActiveRecord::Base#dup`.
|
||||
|
|
|
@ -49,7 +49,7 @@ module ActiveRecord
|
|||
case
|
||||
when new_record?
|
||||
"#{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)
|
||||
"#{self.class.model_name.cache_key}/#{id}-#{timestamp}"
|
||||
else
|
||||
|
|
|
@ -98,6 +98,12 @@ module ActiveRecord
|
|||
timestamp_attributes_for_create + timestamp_attributes_for_update
|
||||
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
|
||||
self.class.default_timezone == :utc ? Time.now.utc : Time.now
|
||||
end
|
||||
|
|
|
@ -1441,12 +1441,30 @@ class BasicsTest < ActiveRecord::TestCase
|
|||
assert_not_equal key, car.cache_key
|
||||
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.update_columns(updated_at: nil)
|
||||
dev.update_columns(updated_at: nil, updated_on: nil)
|
||||
assert_match(/\/#{dev.id}$/, dev.cache_key)
|
||||
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
|
||||
company = Company.new(:rating => 1, :name => "37signals", :firm_name => "37signals")
|
||||
assert_raises(ActiveRecord::ActiveRecordError) do
|
||||
|
|
|
@ -219,6 +219,8 @@ ActiveRecord::Schema.define do
|
|||
t.integer :salary, :default => 70000
|
||||
t.datetime :created_at
|
||||
t.datetime :updated_at
|
||||
t.datetime :created_on
|
||||
t.datetime :updated_on
|
||||
end
|
||||
|
||||
create_table :developers_projects, :force => true, :id => false do |t|
|
||||
|
|
Loading…
Reference in a new issue