# Count array keys possible?

**URL:** <https://www.ruby-forum.com/t/count-array-keys-possible/196900>\
**Category:** Rails\
**Created:** [February 24, 2009, 6:57pm UTC](https://www.ruby-forum.com/t/count-array-keys-possible/196900 "2009-02-24T18:57:59Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![remco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9d8465/32.png) [@remco](https://www.ruby-forum.com/u/remco)\
**Post date:** [February 24, 2009, 6:57pm UTC](https://www.ruby-forum.com/t/count-array-keys-possible/196900/1 "2009-02-24T18:57:59Z")

</div>

Hi,

newbie question(i guess)

a = Bookings.find(:all, :conditions =\> [3.days.ago])  
a = [id : 1, departure : ‘AMS’, arrival =\> ‘NY’],[id : 2, departure :  
‘AMS’, arrival =\> ‘BCN’],[id : 3, departure : ‘AMS’, arrival =\>  
‘BKK’],[id : 4, departure : ‘AMS’, arrival =\> ‘BKK’] ect.

The value of the key departure and arrival is dynamic based on  
table(3000 combinations) and the bookings

I want to find the bookings and count the arrival and departure(s). I  
the case of the code above, i want the following output.

departure = AMS \> total = 5  
arrival = BCN \> total = 1  
arrival = NY \> total = 1  
arrival = BKK \> total = 2

How can i do this

Grtz…remco

---

<div class="post-metadata">

**Author:** ![remco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9d8465/32.png) [@remco](https://www.ruby-forum.com/u/remco)\
**Post date:** [February 25, 2009, 4:16pm UTC](https://www.ruby-forum.com/t/count-array-keys-possible/196900/2 "2009-02-25T16:16:36Z")

</div>

departures = [‘AMS’, ‘BCN’, ‘BBK’]  
sums = {}  
departures.each do |d|  
sums[d] ||= 0  
sums[d] = sums[d] + 1  
end  
puts( sums )

- 

Maurício Linhares  
[http://alinhavado.wordpress.com/](http://alinhavado.wordpress.com/) (pt-br) | [http://blog.codevader.com/](http://blog.codevader.com/)  
(en)

On Tue, Feb 24, 2009 at 2:57 PM, Remco S.

---

<div class="post-metadata">

**Author:** ![remco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9d8465/32.png) [@remco](https://www.ruby-forum.com/u/remco)\
**Post date:** [February 25, 2009, 5:04pm UTC](https://www.ruby-forum.com/t/count-array-keys-possible/196900/3 "2009-02-25T17:04:50Z")

</div>

MaurÃ­cio Linhares wrote:

> departures = [‘AMS’, ‘BCN’, ‘BBK’]  
> sums = {}  
> departures.each do |d|  
> sums[d] ||= 0  
> sums[d] = sums[d] + 1  
> end  
> puts( sums )
> 
> - 
> 
> Maurï¿½cio Linhares  
> [http://alinhavado.wordpress.com/](http://alinhavado.wordpress.com/) (pt-br) | [http://blog.codevader.com/](http://blog.codevader.com/)  
> (en)
> 
> On Tue, Feb 24, 2009 at 2:57 PM, Remco S.

Hi MaurÃ­cio,

Thanks for your reply.

I have more bookings from the same departures, like this:

departures = [‘AMS’, ‘BCN’, ‘BKK’, ‘AMS’, ‘AMS’, ‘BKK’]

Then i want to count the departures, like this based on the array above:

AMS =\> ‘3’  
BCN =\> ‘1’  
BKK =\> ‘2’

Is this possibly?

(the objective is to store the values in a graph for management-info)

Thanks in advance…

remco

---

<div class="post-metadata">

**Author:** ![remco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9d8465/32.png) [@remco](https://www.ruby-forum.com/u/remco)\
**Post date:** [February 25, 2009, 5:32pm UTC](https://www.ruby-forum.com/t/count-array-keys-possible/196900/4 "2009-02-25T17:32:08Z")

</div>

MaurÃ­cio Linhares wrote:

> Why don’t you do it at the database with an order by?
> 
> - 
> 
> MaurÃ­cio Linhares  
> [http://alinhavado.wordpress.com/](http://alinhavado.wordpress.com/) (pt-br) | [http://blog.codevader.com/](http://blog.codevader.com/)  
> (en)
> 
> On Wed, Feb 25, 2009 at 1:04 PM, Remco S.

hmm…i don’t now how to count the values through the order\_by condition  
(yep…i am newbie)

grtz…remco

---

<div class="post-metadata">

**Author:** ![remco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9d8465/32.png) [@remco](https://www.ruby-forum.com/u/remco)\
**Post date:** [February 25, 2009, 5:10pm UTC](https://www.ruby-forum.com/t/count-array-keys-possible/196900/5 "2009-02-25T17:10:29Z")

</div>

Why don’t you do it at the database with an order by?

- 

MaurÃ­cio Linhares  
[http://alinhavado.wordpress.com/](http://alinhavado.wordpress.com/) (pt-br) | [http://blog.codevader.com/](http://blog.codevader.com/)  
(en)

On Wed, Feb 25, 2009 at 1:04 PM, Remco S.

---

<div class="post-metadata">

**Author:** ![remco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9d8465/32.png) [@remco](https://www.ruby-forum.com/u/remco)\
**Post date:** [February 25, 2009, 5:38pm UTC](https://www.ruby-forum.com/t/count-array-keys-possible/196900/6 "2009-02-25T17:38:52Z")

</div>

Ok, so this is the best time to start learning SQL, here’s a good  
start → [Head First SQL [Book]](http://oreilly.com/catalog/9780596526849/)

Here’s how the query would look like:

SELECT departure, COUNT(\*) AS departures\_count FROM bookings GROUP BY  
departure

- 

Maurício Linhares  
[http://alinhavado.wordpress.com/](http://alinhavado.wordpress.com/) (pt-br) | [http://blog.codevader.com/](http://blog.codevader.com/)  
(en)

On Wed, Feb 25, 2009 at 1:32 PM, Remco S.

---

<div class="post-metadata">

**Author:** ![remco](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/9d8465/32.png) [@remco](https://www.ruby-forum.com/u/remco)\
**Post date:** [February 25, 2009, 6:09pm UTC](https://www.ruby-forum.com/t/count-array-keys-possible/196900/7 "2009-02-25T18:09:01Z")

</div>

On Feb 25, 2009, at 11:37 AM, Maurício Linhares wrote:

> [http://alinhavado.wordpress.com/](http://alinhavado.wordpress.com/) (pt-br) | http://  
> [blog.codevader.com/](http://blog.codevader.com/) (en)

You can do some of this with ActiveRecord, too. (Note this is my own  
little extension so don’t go looking in ActiveRecord documentation for  
this particular module.)

module ActiveRecord  
module Groups  
def groups(_columns)  
return if columns.empty?  
options = columns.last.is\_a?(Hash) ? columns.pop.dup : {}  
select = columns.join(‘,’) + ',count(_) AS count\_all’  
group = columns.join(‘,’)  
columns = (columns + [‘count\_all’]).map{|c|c.to\_s}  
find(:all, :select =\> select, :conditions =\>  
options.delete(:conditions),  
:group =\> group).map {|rec| rec.attributes(:only =\>  
columns).values\_at(\*columns) }  
end  
end  
end

require ‘pp’

pp Booking.count # so the Booking model class will exist  
class Booking  
extend ActiveRecord::Groups  
end

cols = [:departure]  
result = Booking.groups(\*cols)

# which gives something like

#=\> [[“AMS”, 3], [“BCN”, 1], [“BKK”, 2] ]

# or write that out to a CSV file

require ‘fastercsv’  
filename = ‘counts.csv’  
FasterCSV.open(filename, ‘w’) do |csv|  
csv \<\< cols  
result.each {|r| csv \<\< r }  
end  
puts “%5d rows in %s”%[result.size, filename]

Exercises for the reader (the OP, in particular):

- look at how the :select option can limit the attributes created in  
the model
- read how the :group option works on ActiveRecord::Base.find
- look at the #attributes method of a model and the Hash#values\_at  
method

-Rob

Rob B. [http://agileconsultingllc.com](http://agileconsultingllc.com)  
removed\_email\_address@domain.invalid
