Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge pull request #9105 from bemurphy/cache_key_updated_on

cache_key consults updated_on timestamp if present

Conflicts:
	activerecord/CHANGELOG.md
  • Loading branch information...
commit 2e3e171e311d158cd22e70f1760f3c5c35729e6c 2 parents d3adfd6 + 1dc98c1
Rafael Mendonça França rafaelfranca authored
10 activerecord/CHANGELOG.md
View
@@ -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*
2  activerecord/lib/active_record/integration.rb
View
@@ -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
6 activerecord/lib/active_record/timestamp.rb
View
@@ -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
22 activerecord/test/cases/base_test.rb
View
@@ -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
2  activerecord/test/schema/schema.rb
View
@@ -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|

1 comment on commit 2e3e171

Yasuo Honda

git bisects says it causes this regression error with Oracle database only. Will investigate later and open pull request/issue if necessary.

$ ARCONN=oracle ruby -Itest test/cases/base_test.rb  -n test_find_keeps_multiple_group_values
Using oracle
Run options: -n test_find_keeps_multiple_group_values --seed 12885

# Running tests:

E

Finished tests in 0.623040s, 1.6050 tests/s, 0.0000 assertions/s.

  1) Error:
BasicsTest#test_find_keeps_multiple_group_values:
ActiveRecord::StatementInvalid: OCIError: ORA-00979: not a GROUP BY expression: SELECT "DEVELOPERS".* FROM "DEVELOPERS"  GROUP BY developers.name, developers.salary, developers.id, developers.created_at, developers.updated_at
    stmt.c:230:in oci8lib_200.so
    /home/yahonda/.rvm/gems/ruby-2.0.0-p0@railsmaster/gems/ruby-oci8-2.1.4/lib/oci8/cursor.rb:126:in `exec'
    /home/yahonda/git/oracle-enhanced/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb:143:in `exec'
    /home/yahonda/git/oracle-enhanced/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb:749:in `block in exec_query'
    /home/yahonda/git/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:334:in `block in log'
    /home/yahonda/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
    /home/yahonda/git/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:329:in `log'
    /home/yahonda/git/oracle-enhanced/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb:1491:in `log'
    /home/yahonda/git/oracle-enhanced/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb:729:in `exec_query'
    /home/yahonda/git/oracle-enhanced/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb:1445:in `select'
    /home/yahonda/git/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:24:in `select_all'
    /home/yahonda/git/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:63:in `select_all'
    /home/yahonda/git/rails/activerecord/lib/active_record/querying.rb:36:in `find_by_sql'
    /home/yahonda/git/rails/activerecord/lib/active_record/relation.rb:555:in `exec_queries'
    /home/yahonda/git/rails/activerecord/lib/active_record/relation.rb:447:in `load'
    /home/yahonda/git/rails/activerecord/lib/active_record/relation.rb:197:in `to_a'
    test/cases/base_test.rb:1145:in `test_find_keeps_multiple_group_values'

1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
$
Please sign in to comment.
Something went wrong with that request. Please try again.