diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2013-11-02 16:05:19 -0700 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2013-11-02 16:05:19 -0700 |
commit | e94e97ca796c0759d8fcb8f946a3bbc60252d329 (patch) | |
tree | 770bd9523e2f18e2e6bb698956f03ac2ca225889 /activerecord | |
parent | 6d30219c2734f2678d74a54b791a311748b3e64f (diff) | |
download | rails-e94e97ca796c0759d8fcb8f946a3bbc60252d329.tar.gz rails-e94e97ca796c0759d8fcb8f946a3bbc60252d329.tar.bz2 rails-e94e97ca796c0759d8fcb8f946a3bbc60252d329.zip |
Extend ActiveRecord::Base#cache_key to take an optional list of timestamp attributes of which the highest will be used.
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/CHANGELOG.md | 10 | ||||
-rw-r--r-- | activerecord/lib/active_record/integration.rb | 10 | ||||
-rw-r--r-- | activerecord/test/cases/integration_test.rb | 8 | ||||
-rw-r--r-- | activerecord/test/fixtures/owners.yml | 1 |
4 files changed, 27 insertions, 2 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 16376b0b89..d12534aaf2 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,13 @@ +* Extend ActiveRecord::Base#cache_key to take an optional list of timestamp attributes of which the highest will be used. + + Example: + + # last_reviewed_at will be used, if that's more recent than updated_at, or vice versa + Person.find(5).cache_key(:updated_at, :last_reviewed_at) + + *DHH* + + * Added ActiveRecord::Base#enum for declaring enum attributes where the values map to integers in the database, but can be queried by name. Example: diff --git a/activerecord/lib/active_record/integration.rb b/activerecord/lib/active_record/integration.rb index 2589b2f3da..6449789fe4 100644 --- a/activerecord/lib/active_record/integration.rb +++ b/activerecord/lib/active_record/integration.rb @@ -45,10 +45,18 @@ module ActiveRecord # Product.new.cache_key # => "products/new" # Product.find(5).cache_key # => "products/5" (updated_at not available) # Person.find(5).cache_key # => "people/5-20071224150000" (updated_at available) - def cache_key + # + # You can also pass a list of named timestamps, and the newest in the list will be + # used to generate the key: + # + # Person.find(5).cache_key(:updated_at, :last_reviewed_at) + def cache_key(*timestamp_names) case when new_record? "#{self.class.model_name.cache_key}/new" + when timestamp_names.any? + timestamps = timestamp_names.collect { |method| send(method) }.compact + "#{self.class.model_name.cache_key}/#{id}-#{timestamps.max.utc.to_s(:number)}" when timestamp = max_updated_column_timestamp timestamp = timestamp.utc.to_s(cache_timestamp_format) "#{self.class.model_name.cache_key}/#{id}-#{timestamp}" diff --git a/activerecord/test/cases/integration_test.rb b/activerecord/test/cases/integration_test.rb index 406aacb056..bceb96eac2 100644 --- a/activerecord/test/cases/integration_test.rb +++ b/activerecord/test/cases/integration_test.rb @@ -3,9 +3,10 @@ require 'models/company' require 'models/developer' require 'models/car' require 'models/bulb' +require 'models/owner' class IntegrationTest < ActiveRecord::TestCase - fixtures :companies, :developers + fixtures :companies, :developers, :owners def test_to_param_should_return_string assert_kind_of String, Client.first.to_param @@ -81,4 +82,9 @@ class IntegrationTest < ActiveRecord::TestCase dev.touch assert_not_equal key, dev.cache_key end + + def test_named_timestamps_for_cache_key + owner = owners(:blackbeard) + assert_equal "owners/#{owner.id}-#{owner.happy_at.utc.to_s(:number)}", owner.cache_key(:updated_at, :happy_at) + end end diff --git a/activerecord/test/fixtures/owners.yml b/activerecord/test/fixtures/owners.yml index 2d21ce433c..3b7b29bb34 100644 --- a/activerecord/test/fixtures/owners.yml +++ b/activerecord/test/fixtures/owners.yml @@ -2,6 +2,7 @@ blackbeard: owner_id: 1 name: blackbeard essay_id: A Modest Proposal + happy_at: '2150-10-10 16:00:00' ashley: owner_id: 2 |