creating an array by reusing code

S

Sijo Kg

Hi
I have
all_req = OnRequest.find:)all, :conditions => [status_id = ?',6])

Now i need to create an array of size 12 containing record counts for
month January to December like [recordcountjanuary,recordcountfeb,....]
So for the first month january I tried like

all_req.select do |r|
r.created_at.mon == 1
end
What i need is reuse the above code I have placed it in a
function But there I have to call it 12 times .How can i avoid this?

Thanks in advance
Sijo
 
J

Jesús Gabriel y Galán

Hi
=A0 I have
all_req =3D OnRequest.find:)all, :conditions =3D> [status_id =3D ?',6])

=A0 Now i need to create an array of size 12 containing record counts for
month January to December like [recordcountjanuary,recordcountfeb,....]
So for the first month january I tried like

all_req.select do |r|
=A0r.created_at.mon =3D=3D 1
end
=A0 =A0 =A0 What i need is reuse the above code I have placed it in a
function But there I have to call it 12 times .How can i avoid this?

Maybe this helps (untested):

recordcount =3D (1..12).map do |month|
all_req.select {|r| r.created_at.mon =3D=3D month}.size
end

Although this does 12 passes through all_req. BTW, if you need the
count you need to check the size of the select. Maybe another approach
could be using a hash:

recordcount =3D Hash.new(0)
all_req.each do |r|
recordcount[r.created_at.mon] +=3D 1
end

Hope this helps,

Jesus.
 
L

lasitha

[...]
=A0 Now i need to create an array of size 12 containing record counts for
month January to December like [recordcountjanuary,recordcountfeb,....]
So for the first month january I tried like

all_req.select do |r|
=A0r.created_at.mon =3D=3D 1
end
=A0 =A0 =A0 What i need is reuse the above code I have placed it in a
function But there I have to call it 12 times .How can i avoid this?

Let's build this up a step at a time...

monthly_counts =3D (1..12).map do |month|
# call your function here, passing in the month
end

Depending on the scope of all_req, it may just be easier to inline the
function as follows:

monthly_counts =3D (1..12).map do |month|
all_req.select {|r| r.created_at.mon =3D=3D month }.size
end

However, this is inefficient. We have to make 12 passes over the
all_req collection.
You can, instead use Enumerable#group_by:

all_req.group_by {|r| r.created_at.mon }

which will return a hash of items keyed by the month. Getting counts
from this is simply a matter of using #map. I'll leave this as an
exercise :)

Now, having said all that, the most efficient way to do this is
probably to use a group_by clause in your finder. Again, left as an
exercise (mostly 'cos i don't know AR :)

solidarity,
lasitha
 
R

Robert Klemme

2009/3/25 lasitha said:
However, this is inefficient. =A0We have to make 12 passes over the
all_req collection.
You can, instead use Enumerable#group_by:

all_req.group_by {|r| r.created_at.mon }

which will return a hash of items keyed by the month. =A0Getting counts
from this is simply a matter of using #map. =A0I'll leave this as an
exercise :)

Or create a counter Hash and loop once:

counts =3D Hash.new 0
all_req.each {|r| counts[r.created_at.mon] +=3D 1}
Now, having said all that, the most efficient way to do this is
probably to use a group_by clause in your finder. =A0Again, left as an
exercise (mostly 'cos i don't know AR :)

Yep, the database solution is probably the best.

Cheers

robert


--=20
remember.guy do |as, often| as.you_can - without end
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
474,176
Messages
2,570,947
Members
47,498
Latest member
log5Sshell/alfa5

Latest Threads

Top