[Fixes #48080] Fix broken distinct in ActiveRecord::Calculations#ids
with includes(...).order(...)
This commit is contained in:
parent
912096d4ce
commit
e856d7f1a2
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user