# Contionnal sum

Hi,

I am wondering if it is possible to create a conditionnal sum.

For instance I would like to do something like this:

@total_amount = @orders.sum { |order| order.amount if order.paid == true
}

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Fernando P. wrote:
| Hi,
|
| I am wondering if it is possible to create a conditionnal sum.
|
| For instance I would like to do something like this:
|
| @total_amount = @orders.sum { |order| order.amount if order.paid == true
| }

Should be.

Something like this (untested, and unsafe, probably not even correct):

def conditional_sum order, condition
~ order.each do |o|
~ sum = sum + o unless o.paid?
~ end
~ return sum
end

I made the idea explicit, so that you should at least get the idea.

Phillip G.
Blog: http://justarubyist.blogspot.com

You! What PLANET is this!
~ – McCoy, “The City on the Edge of Forever”, stardate 3134.0
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkgsZ9UACgkQbtAgaoJTgL8L2gCeLZyAQcn6+o+4McD7qQLJlL1o
qEUAn0JrnuPs7XVBNUYAEuCd6gUIsjBO
=k8YY
-----END PGP SIGNATURE-----

On Thu, May 15, 2008 at 6:26 PM, Fernando P. [email protected]
wrote:

I am wondering if it is possible to create a conditionnal sum.

For instance I would like to do something like this:

@total_amount = @orders.sum { |order| order.amount if order.paid == true
}

sum… is that Rails? If that’s the case you could filter them before:

# untested

@total_sum = @orders.select(&:paid).sum(&:amount)

Although AR has another SQL-based #sum that may be worth exploring if
@orders are ARs.

That being said, perhaps you weren’t aware of the fact that
Enumerable#sum is defined by Active Support, but let me point out that
those extensions are discussed in the very Rails mailing list.

– fxn

Hi,

I am wondering if it is possible to create a conditionnal sum.

For instance I would like to do something like this:

@total_amount = @orders.sum { |order| order.amount if order.paid == true
}

@total_amount = @orders.inject(0) do | sum, order |
order.paid ? sum + order.amount : sum
end

or

@total_amount = @orders.select { | o | o.paid }. sum

BTW: Comparing a boolean value to true or false only shows you don’t
understand booleans.

And if that order class is yours: I’d rather call the accessor »paid?«.

mfg, simon … l

Xavier N. [email protected] wrote:

# untested

@total_sum = @orders.select(&:paid).sum(&:amount)

Although AR has another SQL-based #sum that may be worth exploring if
@orders are ARs.

That being said, perhaps you weren’t aware of the fact that
Enumerable#sum is defined by Active Support, but let me point out that
those extensions are discussed in the very Rails mailing list.

Enumerable#sum is also in facets.
The .select method is a good way, but you can use less memory by doing

@orders.sum {|order| order.paid? order.amount : 0 }

Facets’ #sum doesn’t skip nils, so the method you proposed won’t work.

–Ken

Thank you all for your messages. Yes it is a piece of code I am using in
a Rails app. I thought it would fit better in this list rather than the
Rails one, as the problem is not specific to Rails.

BTW: Comparing a boolean value to true or false only shows you don’t
understand booleans.

Yeah I knew someone would nail me on this. I wanted to make my problem
clear, so that’s why I specified this silly “== true”. In my real code,
I don’t have it trust me. If I hadn’t put it, someone would have come up
with “hey wtf is that order.paid thing!?”

The .select method is a good way, but you can use less memory by doing

@orders.sum {|order| order.paid? order.amount : 0 }

This is fantastic, I knew the solution was super simple. Day after day I
love Ruby more and more.

Best regards, and once again thank you very much for assisting me.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.