提交 1dc98c14 编写于 作者: B Brendon Murphy

cache_key consults updated_on timestamp if present

- Extract max timestamp retrieval for cache_key
- Update changelog for cache_key changes
上级 92aa789c
* 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 @@ def cache_key
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 @@ def all_timestamp_attributes
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 @@ def test_cache_key_changes_when_child_touched
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 @@ def create_table(*args, &block)
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|
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册