@@ -410,6 +410,18 @@ def async_ids
410
410
async . ids
411
411
end
412
412
413
+ protected
414
+ def aggregate_column ( column_name )
415
+ case column_name
416
+ when Arel ::Expressions
417
+ column_name
418
+ when :all
419
+ Arel . star
420
+ else
421
+ arel_column ( column_name )
422
+ end
423
+ end
424
+
413
425
private
414
426
def all_attributes? ( column_names )
415
427
( column_names . map ( &:to_s ) - model . attribute_names - model . attribute_aliases . keys ) . empty?
@@ -457,17 +469,6 @@ def possible_aggregation?(column_names)
457
469
end
458
470
end
459
471
460
- def aggregate_column ( column_name )
461
- case column_name
462
- when Arel ::Expressions
463
- column_name
464
- when :all
465
- Arel . star
466
- else
467
- arel_column ( column_name )
468
- end
469
- end
470
-
471
472
def operation_over_aggregate_column ( column , operation , distinct )
472
473
operation == "count" ? column . count ( distinct ) : column . public_send ( operation )
473
474
end
@@ -483,7 +484,7 @@ def execute_simple_calculation(operation, column_name, distinct) # :nodoc:
483
484
# PostgreSQL doesn't like ORDER BY when there are no GROUP BY
484
485
relation = unscope ( :order ) . distinct! ( false )
485
486
486
- column = aggregate_column ( column_name )
487
+ column = relation . aggregate_column ( column_name )
487
488
select_value = operation_over_aggregate_column ( column , operation , distinct )
488
489
select_value . distinct = true if operation == "sum" && distinct
489
490
@@ -532,7 +533,9 @@ def execute_grouped_calculation(operation, column_name, distinct) # :nodoc:
532
533
}
533
534
group_columns = group_aliases . zip ( group_fields )
534
535
535
- column = aggregate_column ( column_name )
536
+ relation = except ( :group ) . distinct! ( false )
537
+
538
+ column = relation . aggregate_column ( column_name )
536
539
column_alias = column_alias_tracker . alias_for ( "#{ operation } #{ column_name . to_s . downcase } " )
537
540
select_value = operation_over_aggregate_column ( column , operation , distinct )
538
541
select_value . as ( model . adapter_class . quote_column_name ( column_alias ) )
@@ -549,7 +552,6 @@ def execute_grouped_calculation(operation, column_name, distinct) # :nodoc:
549
552
end
550
553
}
551
554
552
- relation = except ( :group ) . distinct! ( false )
553
555
relation . group_values = group_fields
554
556
relation . select_values = select_values
555
557
@@ -666,7 +668,7 @@ def build_count_subquery(relation, column_name, distinct)
666
668
relation . unscope! ( :order )
667
669
else
668
670
column_alias = Arel . sql ( "count_column" )
669
- relation . select_values = [ aggregate_column ( column_name ) . as ( column_alias ) ]
671
+ relation . select_values = [ relation . aggregate_column ( column_name ) . as ( column_alias ) ]
670
672
end
671
673
672
674
subquery_alias = Arel . sql ( "subquery_for_count" , retryable : true )
0 commit comments