Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request rails#9105 from bemurphy/cache_key_updated_on
cache_key consults updated_on timestamp if present

Conflicts:
	activerecord/CHANGELOG.md
  • Loading branch information
rafaelfranca committed Mar 7, 2013
2 parents d3adfd6 + 1dc98c1 commit 2e3e171
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 3 deletions.
10 changes: 10 additions & 0 deletions activerecord/CHANGELOG.md
@@ -1,5 +1,15 @@
## Rails 4.0.0 (unreleased) ##

* 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*

* Throw `NotImplementedError` when trying to instantiate `ActiveRecord::Base` or an abstract class.

*Aaron Weiner*
Expand Down
2 changes: 1 addition & 1 deletion activerecord/lib/active_record/integration.rb
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions activerecord/lib/active_record/timestamp.rb
Expand Up @@ -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
Expand Down
22 changes: 20 additions & 2 deletions activerecord/test/cases/base_test.rb
Expand Up @@ -1455,12 +1455,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
Expand Down
2 changes: 2 additions & 0 deletions activerecord/test/schema/schema.rb
Expand Up @@ -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|
Expand Down

0 comments on commit 2e3e171

Please sign in to comment.