instance method calculate

Ruby on Rails 2.3.18

Since v2.2.3 Last seen in v2.3.18

Available in: v2.2.3 v2.3.18

Signature

calculate(operation, column_name, options = {})

This calculates aggregate values in the given column. Methods for count, sum, average, minimum, and maximum have been added as shortcuts. Options such as :conditions, :order, :group, :having, and :joins can be passed to customize the query.

There are two basic forms of output:

* Single aggregate value: The single value is type cast to Fixnum 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 by the <tt>:group</tt> option.  It takes either a column name, or the name
  of a belongs_to association.

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

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

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

Options:

  • :conditions - An SQL fragment like “administrator = 1” or [ “user_name = ?”, username ]. See conditions in the intro to ActiveRecord::Base.

  • :include: Eager loading, see Associations for details. Since calculations don’t load anything, the purpose of this is to access fields on joined tables in your conditions, order, or group clauses.

  • :joins - An SQL fragment for additional joins like “LEFT JOIN comments ON comments.post_id = id”. (Rarely needed). The records will be returned read-only since they will have attributes that do not correspond to the table’s columns.

  • :order - An SQL fragment like “created_at DESC, name” (really only used with GROUP BY calculations).

  • :group - An attribute name by which the result should be grouped. Uses the GROUP BY SQL-clause.

  • :select - By default, this is * as in SELECT * FROM, but can be changed if you for example want to do a join, but not include the joined columns.

  • :distinct - Set this to true to make this a distinct calculation, such as SELECT COUNT(DISTINCT posts.id) …

Examples:

Person.calculate(:count, :all) # The same as Person.count
Person.average(:age) # SELECT AVG(age) FROM people...
Person.minimum(:age, :conditions => ['last_name != ?', 'Drake']) # Selects the minimum age for everyone with a last name other than 'Drake'
Person.minimum(:age, :having => 'min(age) > 17', :group => :last_name) # Selects the minimum age for any family without any minors
Person.sum("2 * age")

Parameters

operation req
column_name req
options opt = {}
Source
# File activerecord/lib/active_record/calculations.rb, line 125
      def calculate(operation, column_name, options = {})
        validate_calculation_options(operation, options)
        column_name     = options[:select] if options[:select]
        column_name     = '*' if column_name == :all
        column          = column_for column_name
        catch :invalid_query do
          if options[:group]
            return execute_grouped_calculation(operation, column_name, column, options)
          else
            return execute_simple_calculation(operation, column_name, column, options)
          end
        end
        0
      end

Defined in activerecord/lib/active_record/calculations.rb line 125 · View on GitHub · Improve this page · Find usages on GitHub

Defined in ActiveRecord::Calculations::ClassMethods

Type at least 2 characters to search.

↑↓ navigate · open · esc close