Skip to content

Commit cb95c1b

Browse files
authored
ActiveRecord: Optimize cache_key computation (rails#41741)
* Optimize cache_key computation * After review [Svyatoslav Kryukov + Rafael Mendonça França]
1 parent 44c3ce2 commit cb95c1b

File tree

2 files changed

+3
-1
lines changed

2 files changed

+3
-1
lines changed

activerecord/lib/active_record/relation.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ def cache_version(timestamp_column = :updated_at)
357357
def compute_cache_version(timestamp_column) # :nodoc:
358358
timestamp_column = timestamp_column.to_s
359359

360-
if loaded? || distinct_value
360+
if loaded?
361361
size = records.size
362362
if size > 0
363363
timestamp = records.map { |record| record.read_attribute(timestamp_column) }.max
@@ -370,6 +370,7 @@ def compute_cache_version(timestamp_column) # :nodoc:
370370

371371
if collection.has_limit_or_offset?
372372
query = collection.select("#{column} AS collection_cache_key_timestamp")
373+
query._select!(table[Arel.star]) if distinct_value && collection.select_values.empty?
373374
subquery_alias = "subquery_for_cache_key"
374375
subquery_column = "#{subquery_alias}.collection_cache_key_timestamp"
375376
arel = query.build_subquery(subquery_alias, select_values % subquery_column)

activerecord/test/cases/collection_cache_key_test.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ class CollectionCacheKeyTest < ActiveRecord::TestCase
171171
developers = Developer.distinct.order(:salary).limit(5)
172172

173173
assert_match(/\Adevelopers\/query-(\h+)-(\d+)-(\d+)\z/, developers.cache_key)
174+
assert_not_predicate developers, :loaded?
174175
end
175176

176177
test "cache_key with a relation having custom select and order" do

0 commit comments

Comments
 (0)