[Fixes #48080] Fix broken distinct in ActiveRecord::Calculations#ids with includes(...).order(...)

This commit is contained in:
Joshua Young 2023-05-01 14:36:54 +10:00
parent 912096d4ce
commit e856d7f1a2
2 changed files with 12 additions and 3 deletions

@ -325,19 +325,22 @@ def async_pick(*column_names)
# Person.ids # SELECT people.id FROM people
# Person.joins(:companies).ids # SELECT people.id FROM people INNER JOIN companies ON companies.id = people.company_id
def ids
primary_key_array = Array(primary_key)
if loaded?
result = records.pluck(*Array(primary_key))
result = records.pluck(*primary_key_array)
return @async ? Promise::Complete.new(result) : result
end
if has_include?(primary_key)
relation = apply_join_dependency.distinct
relation = apply_join_dependency.group(*primary_key_array)
return relation.ids
end
columns = arel_columns(Array(primary_key))
columns = arel_columns(primary_key_array)
relation = spawn
relation.select_values = columns
result = if relation.where_clause.contradiction?
ActiveRecord::Result.empty
else

@ -1049,6 +1049,12 @@ def test_ids_with_includes
assert_equal Company.all.map(&:id).sort, Company.all.includes(:contracts).ids.sort
end
def test_ids_with_includes_and_non_primary_key_order
rating = 1
Company.all.each { |company| company.update!(rating: rating += 1) }
assert_equal Company.all.sort_by(&:rating).map(&:id), Company.includes(:comments).order(:rating).ids
end
def test_ids_with_includes_and_scope
scoped_ids = [1, 2]
company = Company.where(id: scoped_ids).first