From 60ffe41980f3989637bdf537341288288aa9cc39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Mendon=C3=A7a=20Fran=C3=A7a?= Date: Tue, 19 Jun 2012 00:36:30 -0300 Subject: [PATCH] Extract conditional to a method to avoid duplication Also use if/else block to not use short circuit return --- .../active_record/relation/calculations.rb | 34 +++++++++++-------- activerecord/test/cases/calculations_test.rb | 3 ++ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/activerecord/lib/active_record/relation/calculations.rb b/activerecord/lib/active_record/relation/calculations.rb index d457062341..22c3e6a324 100644 --- a/activerecord/lib/active_record/relation/calculations.rb +++ b/activerecord/lib/active_record/relation/calculations.rb @@ -108,7 +108,7 @@ module ActiveRecord if relation.equal?(self) - if eager_loading? || (includes_values.present? && (column_name || references_eager_loaded_tables?)) + if has_include?(column_name) construct_relation_for_association_calculations.calculate(operation, column_name, options) else perform_calculation(operation, column_name, options) @@ -156,25 +156,25 @@ module ActiveRecord column_name = "#{table_name}.#{column_name}" end - if eager_loading? || (includes_values.present? && (column_name || references_eager_loaded_tables?)) - return construct_relation_for_association_calculations.pluck(column_name) - end + if has_include?(column_name) + construct_relation_for_association_calculations.pluck(column_name) + else + result = klass.connection.select_all(select(column_name).arel, nil, bind_values) - result = klass.connection.select_all(select(column_name).arel, nil, bind_values) - - key = result.columns.first - column = klass.column_types.fetch(key) { - result.column_types.fetch(key) { - Class.new { def type_cast(v); v; end }.new + key = result.columns.first + column = klass.column_types.fetch(key) { + result.column_types.fetch(key) { + Class.new { def type_cast(v); v; end }.new + } } - } - result.map do |attributes| - raise ArgumentError, "Pluck expects to select just one attribute: #{attributes.inspect}" unless attributes.one? + result.map do |attributes| + raise ArgumentError, "Pluck expects to select just one attribute: #{attributes.inspect}" unless attributes.one? - value = klass.initialize_attributes(attributes).values.first + value = klass.initialize_attributes(attributes).values.first - column.type_cast(value) + column.type_cast(value) + end end end @@ -190,6 +190,10 @@ module ActiveRecord private + def has_include?(column_name) + eager_loading? || (includes_values.present? && (column_name || references_eager_loaded_tables?)) + end + def perform_calculation(operation, column_name, options = {}) operation = operation.to_s.downcase diff --git a/activerecord/test/cases/calculations_test.rb b/activerecord/test/cases/calculations_test.rb index abb25fa63a..f748b897ee 100644 --- a/activerecord/test/cases/calculations_test.rb +++ b/activerecord/test/cases/calculations_test.rb @@ -423,6 +423,7 @@ class CalculationsTest < ActiveRecord::TestCase def test_maximum_with_not_auto_table_name_prefix_if_column_included Company.create!(:name => "test", :contracts => [Contract.new(:developer_id => 7)]) + # TODO: Investigate why PG isn't being typecast if current_adapter?(:PostgreSQLAdapter) assert_equal "7", Company.includes(:contracts).maximum(:developer_id) else @@ -433,6 +434,7 @@ class CalculationsTest < ActiveRecord::TestCase def test_minimum_with_not_auto_table_name_prefix_if_column_included Company.create!(:name => "test", :contracts => [Contract.new(:developer_id => 7)]) + # TODO: Investigate why PG isn't being typecast if current_adapter?(:PostgreSQLAdapter) assert_equal "7", Company.includes(:contracts).minimum(:developer_id) else @@ -443,6 +445,7 @@ class CalculationsTest < ActiveRecord::TestCase def test_sum_with_not_auto_table_name_prefix_if_column_included Company.create!(:name => "test", :contracts => [Contract.new(:developer_id => 7)]) + # TODO: Investigate why PG isn't being typecast if current_adapter?(:MysqlAdapter) || current_adapter?(:PostgreSQLAdapter) assert_equal "7", Company.includes(:contracts).sum(:developer_id) else