1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Merge branch 'master' of git://github.com/rails/rails

This commit is contained in:
José Valim 2010-01-19 14:29:11 +01:00
commit f32e3aff5f
3 changed files with 38 additions and 44 deletions

View file

@ -64,41 +64,7 @@ module ActiveRecord
0
end
# Calculates the average value on a given column. The value is returned as
# a float, or +nil+ if there's no row. See +calculate+ for examples with
# options.
#
# Person.average('age') # => 35.8
def average(column_name, options = {})
calculate(:average, column_name, options)
end
# Calculates the minimum value on a given column. The value is returned
# with the same data type of the column, or +nil+ if there's no row. See
# +calculate+ for examples with options.
#
# Person.minimum('age') # => 7
def minimum(column_name, options = {})
calculate(:minimum, column_name, options)
end
# Calculates the maximum value on a given column. The value is returned
# with the same data type of the column, or +nil+ if there's no row. See
# +calculate+ for examples with options.
#
# Person.maximum('age') # => 93
def maximum(column_name, options = {})
calculate(:maximum, column_name, options)
end
# Calculates the sum of values on a given column. The value is returned
# with the same data type of the column, 0 if there's no row. See
# +calculate+ for examples with options.
#
# Person.sum('age') # => 4562
def sum(column_name, options = {})
calculate(:sum, column_name, options)
end
delegate :average, :minimum, :maximum, :sum, :to => :scoped
# This calculates aggregate values in the given column. Methods for count, sum, average, minimum, and maximum have been added as shortcuts.
# Options such as <tt>:conditions</tt>, <tt>:order</tt>, <tt>:group</tt>, <tt>:having</tt>, and <tt>:joins</tt> can be passed to customize the query.

View file

@ -182,7 +182,7 @@ module ActiveRecord
end
def ==(other)
to_a == other.to_a
other.respond_to?(:to_a) ? to_a == other.to_a : false
end
private

View file

@ -5,20 +5,40 @@ module ActiveRecord
calculate(:count, *construct_count_options_from_args(*args))
end
def average(column_name)
calculate(:average, column_name)
# Calculates the average value on a given column. The value is returned as
# a float, or +nil+ if there's no row. See +calculate+ for examples with
# options.
#
# Person.average('age') # => 35.8
def average(column_name, options = {})
calculation_relation(options).calculate(:average, column_name)
end
def minimum(column_name)
calculate(:minimum, column_name)
# Calculates the minimum value on a given column. The value is returned
# with the same data type of the column, or +nil+ if there's no row. See
# +calculate+ for examples with options.
#
# Person.minimum('age') # => 7
def minimum(column_name, options = {})
calculation_relation(options).calculate(:minimum, column_name)
end
def maximum(column_name)
calculate(:maximum, column_name)
# Calculates the maximum value on a given column. The value is returned
# with the same data type of the column, or +nil+ if there's no row. See
# +calculate+ for examples with options.
#
# Person.maximum('age') # => 93
def maximum(column_name, options = {})
calculation_relation(options).calculate(:maximum, column_name)
end
def sum(column_name)
calculate(:sum, column_name)
# Calculates the sum of values on a given column. The value is returned
# with the same data type of the column, 0 if there's no row. See
# +calculate+ for examples with options.
#
# Person.sum('age') # => 4562
def sum(column_name, options = {})
calculation_relation(options).calculate(:sum, column_name)
end
def calculate(operation, column_name, options = {})
@ -49,6 +69,14 @@ module ActiveRecord
0
end
def calculation_relation(options = {})
if options.present?
apply_finder_options(options.except(:distinct)).calculation_relation
else
(eager_loading? || includes_values.present?) ? construct_relation_for_association_calculations : self
end
end
private
def execute_simple_calculation(operation, column_name, distinct) #:nodoc: