Skip to content

Commit 17d8cd4

Browse files
authored
Merge pull request rails#53994 from kamipo/fix_group_by_qualified_name_on_loaded
Fix count with group by qualified name on loaded relation
2 parents 035ff71 + 19f7c34 commit 17d8cd4

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

activerecord/lib/active_record/relation/calculations.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,9 @@ def execute_grouped_calculation(operation, column_name, distinct) # :nodoc:
522522
associated = association && association.belongs_to? # only count belongs_to associations
523523
group_fields = Array(association.foreign_key) if associated
524524
end
525-
group_fields = arel_columns(group_fields)
525+
526+
relation = except(:group).distinct!(false)
527+
group_fields = relation.arel_columns(group_fields)
526528

527529
model.with_connection do |connection|
528530
column_alias_tracker = ColumnAliasTracker.new(connection)
@@ -533,8 +535,6 @@ def execute_grouped_calculation(operation, column_name, distinct) # :nodoc:
533535
}
534536
group_columns = group_aliases.zip(group_fields)
535537

536-
relation = except(:group).distinct!(false)
537-
538538
column = relation.aggregate_column(column_name)
539539
column_alias = column_alias_tracker.alias_for("#{operation} #{column_name.to_s.downcase}")
540540
select_value = operation_over_aggregate_column(column, operation, distinct)

activerecord/test/cases/calculations_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,20 @@ def test_should_sum_with_qualified_name_on_loaded
5353
assert_equal 318, accounts.sum("accounts.credit_limit")
5454
end
5555

56+
def test_should_count_with_group_by_qualified_name_on_loaded
57+
accounts = Account.group("accounts.id")
58+
59+
expected = { 1 => 1, 2 => 1, 3 => 1, 4 => 1, 5 => 1, 6 => 1 }
60+
61+
assert_not_predicate accounts, :loaded?
62+
assert_equal expected, accounts.count
63+
64+
accounts.load
65+
66+
assert_predicate accounts, :loaded?
67+
assert_equal expected, accounts.count
68+
end
69+
5670
def test_should_average_field
5771
assert_equal 53.0, Account.average(:credit_limit)
5872
assert_async_equal 53.0, Account.async_average(:credit_limit)

0 commit comments

Comments
 (0)