[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Contionnal sum

Fernando Perez

5/15/2008 4:26:00 PM

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
}
--
Posted via http://www.ruby-....

5 Answers

Phillip Gawlowski

5/15/2008 4:42:00 PM

0

-----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.bl...

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....

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

Xavier Noria

5/15/2008 4:47:00 PM

0

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

Ken Bloom

5/15/2008 5:17:00 PM

0

Xavier Noria <fxn@hashref.com> wrote:
> 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.

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

--
Ken (Chanoch) Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu...

Simon Krahnke

5/15/2008 5:25:00 PM

0

* 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

Fernando Perez

5/15/2008 7:47:00 PM

0

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.

--
Posted via http://www.ruby-....