提交 f32e3aff 编写于 作者: J José Valim

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

......@@ -64,41 +64,7 @@ def count(*args)
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.
......
......@@ -182,7 +182,7 @@ def count(*args)
end
def ==(other)
to_a == other.to_a
other.respond_to?(:to_a) ? to_a == other.to_a : false
end
private
......
......@@ -5,20 +5,40 @@ def count(*args)
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 @@ def calculate(operation, column_name, options = {})
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:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册