module ActiveRecord::Calculations
def calculate(operation, column_name)
...
values.each do |family, max_age|
# => 43
puts values[drake]
values = Person.group(:family).maximum(:age) # Person belongs_to :family
drake = Family.find_by(last_name: 'Drake')
# => 43
puts values["Drake"]
values = Person.group('last_name').maximum(:age)
takes either a column name, or the name of a belongs_to association.
* Grouped values: This returns an ordered hash of the values and groups them. It
for AVG, and the given column's type for everything else.
* Single aggregate value: The single value is type cast to Integer for COUNT, Float
There are two basic forms of output:
Person.sum("2 * age")
Person.group(:last_name).having("min(age) > 17").minimum(:age)
# Selects the minimum age for any family without any minors
Person.average(:age) # SELECT AVG(age) FROM people...
Person.calculate(:count, :all) # The same as Person.count
#minimum, and #maximum have been added as shortcuts.
This calculates aggregate values in the given column. Methods for #count, #sum, #average,
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 = [] if group_values.empty? end relation.calculate(operation, column_name) else perform_calculation(operation, column_name) end end