aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2017-12-29 22:10:24 +0900
committerRyuta Kamizono <kamipo@gmail.com>2017-12-29 22:12:06 +0900
commitc10c21f2e1d0481db0eaa764c1605000b8a5c7bd (patch)
tree3d3ce16356b013cb11f1a6efed9c64ce6a36bdf2
parentdab7d401e8dd6192e36787f7b5b574d30b368388 (diff)
downloadrails-c10c21f2e1d0481db0eaa764c1605000b8a5c7bd.tar.gz
rails-c10c21f2e1d0481db0eaa764c1605000b8a5c7bd.tar.bz2
rails-c10c21f2e1d0481db0eaa764c1605000b8a5c7bd.zip
Fix `cache_key` with a relation having custom select and order
We can't replace existing select list as long as referenced by ORDER BY.
-rw-r--r--activerecord/lib/active_record/collection_cache_key.rb3
-rw-r--r--activerecord/test/cases/collection_cache_key_test.rb6
2 files changed, 7 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/collection_cache_key.rb b/activerecord/lib/active_record/collection_cache_key.rb
index 023d144693..12e4fae865 100644
--- a/activerecord/lib/active_record/collection_cache_key.rb
+++ b/activerecord/lib/active_record/collection_cache_key.rb
@@ -20,8 +20,7 @@ module ActiveRecord
select_values = "COUNT(*) AS #{connection.quote_column_name("size")}, MAX(%s) AS timestamp"
if collection.has_limit_or_offset?
- query = collection.spawn
- query.select_values = [column]
+ query = collection.select(column)
subquery_alias = "subquery_for_cache_key"
subquery_column = "#{subquery_alias}.#{timestamp_column}"
subquery = query.arel.as(subquery_alias)
diff --git a/activerecord/test/cases/collection_cache_key_test.rb b/activerecord/test/cases/collection_cache_key_test.rb
index 479c9e03a5..c3af32394e 100644
--- a/activerecord/test/cases/collection_cache_key_test.rb
+++ b/activerecord/test/cases/collection_cache_key_test.rb
@@ -141,5 +141,11 @@ module ActiveRecord
assert_match(/\Adevelopers\/query-(\h+)-(\d+)-(\d+)\z/, developers.cache_key)
end
+
+ test "cache_key with a relation having custom select and order" do
+ developers = Developer.select("name AS dev_name").order("dev_name DESC").limit(5)
+
+ assert_match(/\Adevelopers\/query-(\h+)-(\d+)-(\d+)\z/, developers.cache_key)
+ end
end
end