From a7628099de796a2db2c18e946dab319abd0fcba2 Mon Sep 17 00:00:00 2001 From: Soutaro Matsumoto Date: Fri, 25 Sep 2015 00:30:22 +0900 Subject: [PATCH] Qualify column names in calculation Column names inserted via `group` have to be qualified with table name. --- activerecord/CHANGELOG.md | 7 +++++++ .../active_record/relation/calculations.rb | 2 +- activerecord/test/cases/calculations_test.rb | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 901f043544..ed861dc4d6 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,10 @@ +* Qualify column name inserted by `group` in calculation + + Giving `group` an unqualified column name now works, even if the relation + has `JOIN` with another table which also has a column of the name. + + *Soutaro Matsumoto* + * Don't cache prepared statements containing an IN clause or a SQL literal, as these queries will change often and are unlikely to have a cache hit. diff --git a/activerecord/lib/active_record/relation/calculations.rb b/activerecord/lib/active_record/relation/calculations.rb index 16d5774fec..1ff06b0679 100644 --- a/activerecord/lib/active_record/relation/calculations.rb +++ b/activerecord/lib/active_record/relation/calculations.rb @@ -297,7 +297,7 @@ def execute_grouped_calculation(operation, column_name, distinct) #:nodoc: ] select_values += select_values unless having_clause.empty? - select_values.concat group_fields.zip(group_aliases).map { |field,aliaz| + select_values.concat arel_columns(group_fields).zip(group_aliases).map { |field,aliaz| if field.respond_to?(:as) field.as(aliaz) else diff --git a/activerecord/test/cases/calculations_test.rb b/activerecord/test/cases/calculations_test.rb index d904b802fa..ba69823250 100644 --- a/activerecord/test/cases/calculations_test.rb +++ b/activerecord/test/cases/calculations_test.rb @@ -102,6 +102,25 @@ def test_should_group_by_summed_field assert_equal 60, c[2] end + def test_should_generate_valid_sql_with_joins_and_group + assert_nothing_raised ActiveRecord::StatementInvalid do + AuditLog.joins(:developer).group(:id).count + end + end + + def test_should_calculate_against_given_relation + developer = Developer.create!(name: "developer") + developer.audit_logs.create!(message: "first log") + developer.audit_logs.create!(message: "second log") + + c = developer.audit_logs.joins(:developer).group(:id).count + + assert_equal developer.audit_logs.count, c.size + developer.audit_logs.each do |log| + assert_equal 1, c[log.id] + end + end + def test_should_order_by_grouped_field c = Account.group(:firm_id).order("firm_id").sum(:credit_limit) assert_equal [1, 2, 6, 9], c.keys.compact -- GitLab