aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation/calculations.rb
diff options
context:
space:
mode:
authorchrisfinne <chris.finne@gmail.com>2011-12-16 08:10:05 -0800
committerCarlos Antonio da Silva <carlosantoniodasilva@gmail.com>2012-05-28 23:16:07 -0300
commit9cc2bf69ce296b7351dc612a8366193390a305f3 (patch)
tree5fd70bde4f778e07703a521c07e04f378ccd58d6 /activerecord/lib/active_record/relation/calculations.rb
parent6f1d9d00ffd9d411b2bd488da4eb92b7e2fd972e (diff)
downloadrails-9cc2bf69ce296b7351dc612a8366193390a305f3.tar.gz
rails-9cc2bf69ce296b7351dc612a8366193390a305f3.tar.bz2
rails-9cc2bf69ce296b7351dc612a8366193390a305f3.zip
Allow blocks for count with ActiveRecord::Relation. Document and test that sum allows blocks
Diffstat (limited to 'activerecord/lib/active_record/relation/calculations.rb')
-rw-r--r--activerecord/lib/active_record/relation/calculations.rb17
1 files changed, 14 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/relation/calculations.rb b/activerecord/lib/active_record/relation/calculations.rb
index 31d99f0192..a0d24f28d0 100644
--- a/activerecord/lib/active_record/relation/calculations.rb
+++ b/activerecord/lib/active_record/relation/calculations.rb
@@ -16,9 +16,16 @@ module ActiveRecord
#
# Person.count(:age, distinct: true)
# # => counts the number of different age values
+ #
+ # Person.where("age > 26").count { |person| gender == 'female' }
+ # # => queries people where "age > 26" then count the loaded results filtering by gender
def count(column_name = nil, options = {})
- column_name, options = nil, column_name if column_name.is_a?(Hash)
- calculate(:count, column_name, options)
+ if block_given?
+ self.to_a.count { |*block_args| yield(*block_args) }
+ else
+ column_name, options = nil, column_name if column_name.is_a?(Hash)
+ calculate(:count, column_name, options)
+ end
end
# Calculates the average value on a given column. Returns +nil+ if there's
@@ -52,9 +59,13 @@ module ActiveRecord
# +calculate+ for examples with options.
#
# Person.sum('age') # => 4562
+ # # => returns the total sum of all people's age
+ #
+ # Person.where('age > 100').sum { |person| person.age - 100 }
+ # # queries people where "age > 100" then perform a sum calculation with the block returns
def sum(*args)
if block_given?
- self.to_a.sum(*args) {|*block_args| yield(*block_args)}
+ self.to_a.sum(*args) { |*block_args| yield(*block_args) }
else
calculate(:sum, *args)
end