# Calculations on arrays?

**URL:** <https://www.ruby-forum.com/t/calculations-on-arrays/125559>\
**Category:** Rails\
**Created:** [January 10, 2008, 3:28am UTC](https://www.ruby-forum.com/t/calculations-on-arrays/125559 "2008-01-10T03:28:27Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![daveamos](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a698b9/32.png) [@daveamos](https://www.ruby-forum.com/u/daveamos)\
**Post date:** [January 10, 2008, 3:28am UTC](https://www.ruby-forum.com/t/calculations-on-arrays/125559/1 "2008-01-10T03:28:27Z")

</div>

Hi everyone,

I was wondering if there’s an easy way to grab the sum of a column in an  
array in ruby? Something that would work like @posts.sum(:column\_name).  
I know there’s one for Classes, but is there something similar for  
arrays?

Thanks!

---

<div class="post-metadata">

**Author:** ![daveamos](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a698b9/32.png) [@daveamos](https://www.ruby-forum.com/u/daveamos)\
**Post date:** [January 10, 2008, 3:37am UTC](https://www.ruby-forum.com/t/calculations-on-arrays/125559/2 "2008-01-10T03:37:21Z")

</div>

Dave A. wrote:

> Hi everyone,
> 
> I was wondering if there’s an easy way to grab the sum of a column in an  
> array in ruby? Something that would work like @posts.sum(:column\_name).  
> I know there’s one for Classes, but is there something similar for  
> arrays?
> 
> Thanks!

Something like this?

total\_comments = posts.inject(0) { |sum, post| sum + post.comments.size  
}

---

<div class="post-metadata">

**Author:** ![daveamos](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a698b9/32.png) [@daveamos](https://www.ruby-forum.com/u/daveamos)\
**Post date:** [January 10, 2008, 3:40am UTC](https://www.ruby-forum.com/t/calculations-on-arrays/125559/3 "2008-01-10T03:40:53Z")

</div>

posts.map { |p| p.comments.size }.sum

will also do the trick

On Jan 10, 2008 1:07 PM, Jeremy Weiskotten  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Something like this?
> 
> ## total\_comments = posts.inject(0) { |sum, post| sum + post.comments.size }
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).
> 
> >

–  
Ryan B.

> **[frozenplague.net](http://www.frozenplague.net)**
>
> This domain may be for sale!

Feel free to add me to MSN and/or GTalk as this email.

---

<div class="post-metadata">

**Author:** ![daveamos](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a698b9/32.png) [@daveamos](https://www.ruby-forum.com/u/daveamos)\
**Post date:** [January 10, 2008, 3:45am UTC](https://www.ruby-forum.com/t/calculations-on-arrays/125559/4 "2008-01-10T03:45:38Z")

</div>

Ryan B. wrote:

> posts.map { |p| p.comments.size }.sum
> 
> will also do the trick
> 
> On Jan 10, 2008 1:07 PM, Jeremy Weiskotten  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> wrote:
> 
> > Something like this?
> > 
> > ## total\_comments = posts.inject(0) { |sum, post| sum + post.comments.size }
> > 
> > Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).
> > 
> > >
> 
> –  
> Ryan B.  
> [http://www.frozenplague.net](http://www.frozenplague.net)  
> Feel free to add me to MSN and/or GTalk as this email.

Will that work? Array#sum doesn’t exist.

Also, there’s a missing “=” character in my previous reply. Use this  
instead:

total\_comments = posts.inject(0) { |sum, post| sum += post.comments.size  
}

---

<div class="post-metadata">

**Author:** ![daveamos](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a698b9/32.png) [@daveamos](https://www.ruby-forum.com/u/daveamos)\
**Post date:** [January 10, 2008, 3:47am UTC](https://www.ruby-forum.com/t/calculations-on-arrays/125559/5 "2008-01-10T03:47:23Z")

</div>

> Will that work? Array#sum doesn’t exist.

Ah, I see. Rails adds it to Enumerable. Nice!

---

<div class="post-metadata">

**Author:** ![daveamos](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a698b9/32.png) [@daveamos](https://www.ruby-forum.com/u/daveamos)\
**Post date:** [January 10, 2008, 3:49am UTC](https://www.ruby-forum.com/t/calculations-on-arrays/125559/6 "2008-01-10T03:49:06Z")

</div>

I was going to say:

Posts.find(:all).map(&:column\_name).sum  
or  
posts.map(&:column\_name).sum

Although Ryan’s example is probably much faster being it doesn’t have to  
do a query if the data is already cached.

I don’t have an

---

<div class="post-metadata">

**Author:** ![daveamos](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a698b9/32.png) [@daveamos](https://www.ruby-forum.com/u/daveamos)\
**Post date:** [January 10, 2008, 3:58am UTC](https://www.ruby-forum.com/t/calculations-on-arrays/125559/7 "2008-01-10T03:58:27Z")

</div>

It will be even faster if you had a counter\_cache on the comments too,  
just  
another field for a post record to store the number of comments it has.  
Built-in feature of Rails.

On Jan 10, 2008 1:18 PM, Russell McConnachie [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> I don’t have an
> 
> > ```
> > Dave A. wrote:
> > 
> > >
> > 
> > ```
> 
> >

–  
Ryan B.

> **[frozenplague.net](http://www.frozenplague.net)**
>
> This domain may be for sale!

Feel free to add me to MSN and/or GTalk as this email.

---

<div class="post-metadata">

**Author:** ![daveamos](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a698b9/32.png) [@daveamos](https://www.ruby-forum.com/u/daveamos)\
**Post date:** [January 10, 2008, 3:58am UTC](https://www.ruby-forum.com/t/calculations-on-arrays/125559/8 "2008-01-10T03:58:15Z")

</div>

Wow, thanks! I’ll try a couple of these ideas out and see what works  
best for me.

---

<div class="post-metadata">

**Author:** ![daveamos](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a698b9/32.png) [@daveamos](https://www.ruby-forum.com/u/daveamos)\
**Post date:** [December 12, 2009, 5:07am UTC](https://www.ruby-forum.com/t/calculations-on-arrays/125559/9 "2009-12-12T05:07:37Z")

</div>

Ryan B. wrote:

> posts.map { |p| p.comments.size }.sum
> 
> will also do the trick

thank you so much! worked well.
