# Enumeration sum

**URL:** <https://www.ruby-forum.com/t/enumeration-sum/137418>\
**Category:** Rails\
**Created:** [May 13, 2008, 12:42am UTC](https://www.ruby-forum.com/t/enumeration-sum/137418 "2008-05-13T00:42:33Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![emeratius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/59ef9b/32.png) [@emeratius](https://www.ruby-forum.com/u/emeratius)\
**Post date:** [May 13, 2008, 12:42am UTC](https://www.ruby-forum.com/t/enumeration-sum/137418/1 "2008-05-13T00:42:33Z")

</div>

Any idees why I can do this:  
@sum = @selected.inject(0) { |sum, player| sum + player.value }

but not this:  
@sum = @selected.sum { |player| player.value }  
@sum = @selected.sum(&:value)

The last two give me following error:

wrong number of arguments (1 for 2)

/Library/Ruby/Gems/1.8/gems/activerecord-2.0.2/lib/active\_record/associations/association\_collection.rb:164:in  
`calculate' /Library/Ruby/Gems/1.8/gems/activerecord-2.0.2/lib/active_record/associations/association_collection.rb:164:in`send’  
/Library/Ruby/Gems/1.8/gems/activerecord-2.0.2/lib/active\_record/associations/association\_collection.rb:164:in  
`method_missing' /Library/Ruby/Gems/1.8/gems/activerecord-2.0.2/lib/active_record/base.rb:1693:in`with\_scope’  
/Library/Ruby/Gems/1.8/gems/activerecord-2.0.2/lib/active\_record/associations/association\_collection.rb:164:in  
`send' /Library/Ruby/Gems/1.8/gems/activerecord-2.0.2/lib/active_record/associations/association_collection.rb:164:in`method\_missing’  
/Library/Ruby/Gems/1.8/gems/activerecord-2.0.2/lib/active\_record/associations/association\_collection.rb:47:in  
`sum' app/controllers/player_controller.rb:31:in`select’

---

<div class="post-metadata">

**Author:** ![emeratius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/59ef9b/32.png) [@emeratius](https://www.ruby-forum.com/u/emeratius)\
**Post date:** [May 13, 2008, 12:51am UTC](https://www.ruby-forum.com/t/enumeration-sum/137418/2 "2008-05-13T00:51:46Z")

</div>

On 12 May 2008, at 23:42, Fredrik [:all] wrote:

> Any idees why I can do this:  
> @sum = @selected.inject(0) { |sum, player| sum + player.value }
> 
> but not this:  
> @sum = @selected.sum { |player| player.value }  
> @sum = @selected.sum(&:value)
> 
> The last two give me following error:

Because rails redefines sum so that you can do  
some\_association.sum :some\_column\_name

Fred

---

<div class="post-metadata">

**Author:** ![emeratius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/59ef9b/32.png) [@emeratius](https://www.ruby-forum.com/u/emeratius)\
**Post date:** [May 13, 2008, 2:33am UTC](https://www.ruby-forum.com/t/enumeration-sum/137418/3 "2008-05-13T02:33:29Z")

</div>

Frederick C. wrote:

> Because rails redefines sum so that you can do  
> some\_association.sum :some\_column\_name

More specifically, the #sum method on an ActiveRecord collection proxy  
queries the database with the argument provided.

If you want to use more complex summations you can using what you’re  
used to with inject by saying:

@sum = @selected.to\_a.sum { |player| player.value }

Or a more complex summation:

@sum = @selected.to\_a.sum { |player| player.value + player.handicap }

Cheers,  
Daniel

---

<div class="post-metadata">

**Author:** ![emeratius](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/59ef9b/32.png) [@emeratius](https://www.ruby-forum.com/u/emeratius)\
**Post date:** [May 13, 2008, 2:38am UTC](https://www.ruby-forum.com/t/enumeration-sum/137418/4 "2008-05-13T02:38:50Z")

</div>

Say you have a players table with a score field in it and you want to  
find  
the combined score of all players.

Player.find(:all, :select =\> “score”).map(&:score).sum
