hashes

hopefully someone might be able to shed some light on this.

I have a ruby test application which I'm fetching data from a database. I want to store the results into a hash based on the following principle;

loop through the rows    does the hash contain a key value as read from that row    if it does then place the row into an array and then add it to an array of rows which might already be within the hash    if the hash doesn't contain the key then create a key and add the row to an array an append it to the hash

unfortunately i'm relatively new to Ruby and can't figure out how to do this. In a few simply tests I declare a variable called

a =

when I loop over the returned database rows using row, I assign row into a

a += row

this works but rather than the array being a length of the total number of rows, it's actually the length of all the rows multiplied by the number of columns. I guess the first problem is getting the rows into a correct array. Once this is done I should be able to say

"hash, have you got a key with the value 1" - the hash might say "yes, and here is an array of rows." I'll take that array of rows and add another row to it and save back to the hash.

can anyone help?

hopefully someone might be able to shed some light on this.

I have a ruby test application which I'm fetching data from a database. I want to store the results into a hash based on the following principle;

loop through the rows   does the hash contain a key value as read from that row   if it does then place the row into an array and then add it to an array of rows which might already be within the hash   if the hash doesn't contain the key then create a key and add the row to an array an append it to the hash

unfortunately i'm relatively new to Ruby and can't figure out how to do this. In a few simply tests I declare a variable called

a =

when I loop over the returned database rows using row, I assign row into a

a += row

Some thing like

result = {} rows.each do |row|    key = find_key_for_row row    result[key] ||=    result[key] << row end

maybe?

My advice would be to start here:

http://www.ruby-doc.org/core/

and look at the Array and Hash classes. You'll learn a lot and be very happy to did.

Peace, Phillip

I made slight progress with feedback from both Phillip and Frederick.

I can now assign a key to the hash and query whats in the hash based on that key, but again the hash isn't storing an array of rows, but rather an array of all the column values from every row... just need to sort this out....

thanks

Post the code that you currently have. We'll see if we can sort it out.

Peace, Phillip

Thanks. I've pasted the code below, which might I add is just a load of test code.

I make the connection to the postgress db and select all the data from a table called test.

I then loop on the results, and at the moment I simply dump them into the hash. I plan to add hash.has_key to check beforehand, but the code below doesn't reflect that.

db = PGconn.connect(*****) #db.type_translation = true res = db.exec(' select * from test')

a = {} res.each do |r|   start_date = DateTime.parse(r[2])   frequency = r[5].to_i   case r[4].to_i     when 1 #yearly       if !do_yearly?(start_date, frequency)                                 a[r[0]] = r       end     when 2 #monthly       if !do_monthly?(start_date, frequency)         a[r[0]] = r       end     when 3 #weekly       if !do_weekly?(start_date, frequency)         a[r[0]] = r       end   end end db.close

I'd try a couple of things.

see below

a = {} res.each do |r|   start_date = DateTime.parse(r[2])   frequency = r[5].to_i   case r[4].to_i     when 1 #yearly       if !do_yearly?(start_date, frequency)                                 a[r[0]] = r

a[r[0]] << r

instead of

a[r[0]] = r

The other thing would be to create a[r[0]] as an array explicitly when you check to see if it's there

a[r[0]] = Array.new if !a.has_key?(r[0])

But if Fred offers something, take his advice first :slight_smile:

Peace, Phillip

found a little more information

a = Hash.new{|hash,key| hash[key] =}

and then use

a[r[0]] << r if !do_yearly?(start_date, frequency)

Do you know Fred then?

Only what I see of him in this group. I haven't seen bad advice come from him yet. And the knowledge he possesses exceeds mine. By quite a bit, it seems. As does that of many others...

Peace, Phillip

oh right, well that might well be the case but at the very least your knowledge exceeds mine. I'm in the process of jumping ships from all out MS to more open source. Played about with Django for a while but got annoyed with the limitations imposed by the template language. Then Ruby on Rails came to light. Done a few small projects on it and feel that I'm coming along with leaps and bounds, I just think the real bottleneck, for me, is learning the Ruby language...not to mention prototype which is somewhat different than JQuery, which I'm pretty proficient in.