def calculate(operation, column_name)
      if has_include?(column_name)
        relation = apply_join_dependency

        if operation.to_s.downcase == "count"
          unless distinct_value || distinct_select?(column_name || select_for_count)
            relation.distinct!
            relation.select_values = [ klass.primary_key || table[Arel.star] ]
          end
          # PostgreSQL: ORDER BY expressions must appear in SELECT list when using DISTINCT
          relation.order_values = []
        end

        relation.calculate(operation, column_name)
      else
        perform_calculation(operation, column_name)
      end
    end
def calculate(operation, column_name)
      if has_include?(column_name)
        relation = apply_join_dependency

        if operation.to_s.downcase == "count"
          unless distinct_value || distinct_select?(column_name || select_for_count)
            relation.distinct!
            relation.select_values = [ klass.primary_key || table[Arel.star] ]
          end
          # PostgreSQL: ORDER BY expressions must appear in SELECT list when using DISTINCT
          relation.order_values = []
        end

        relation.calculate(operation, column_name)
      else
        perform_calculation(operation, column_name)
      end
    end
This calculates aggregate values in the given column. Methods for #count, #sum, #average,
 #minimum, and #maximum have been added as shortcuts.

   Person.calculate(:count, :all) # The same as Person.count
   Person.average(:age) # SELECT AVG(age) FROM people...

   # Selects the minimum age for any family without any minors
   Person.group(:last_name).having("min(age) > 17").minimum(:age)

   Person.sum("2 * age")

 There are two basic forms of output:

 * Single aggregate value: The single value is type cast to Integer for COUNT, Float
   for AVG, and the given column's type for everything else.

 * Grouped values: This returns an ordered hash of the values and groups them. It
   takes either a column name, or the name of a belongs_to association.

      values = Person.group('last_name').maximum(:age)
      puts values["Drake"]
      # => 43

      drake  = Family.find_by(last_name: 'Drake')
      values = Person.group(:family).maximum(:age) # Person belongs_to :family
      puts values[drake]
      # => 43

      values.each do |family, max_age|
        ...
      end