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?
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?
Maybe this helps (untested):
recordcount = (1…12).map do |month|
all_req.select {|r| r.created_at.mon == 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 = Hash.new(0)
all_req.each do |r|
recordcount[r.created_at.mon] += 1
end
[…]
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?
Let’s build this up a step at a time…
monthly_counts = (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 = (1…12).map do |month|
all_req.select {|r| r.created_at.mon == 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
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
Yep, the database solution is probably the best.
Cheers
robert
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.