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
}
on 15.05.2008 18:26
on 15.05.2008 18:44
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Fernando Perez 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 Gawlowski
Twitter: twitter.com/cynicalryan
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 15.05.2008 18:48
On Thu, May 15, 2008 at 6:26 PM, Fernando Perez <pedrolito@lavache.com> 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
on 15.05.2008 19:36
* Fernando Perez <pedrolito@lavache.com> (18:26) schrieb: > 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
on 15.05.2008 19:40
Xavier Noria <fxn@hashref.com> 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
on 15.05.2008 21:46
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.