Forum: Ruby hash problem

Posted by Antonio Fernández vara (fernandezvara)
on 2010-09-01 17:37
Hi all,

I'm sure that there is somewhere an explanation on how this works but I
can't find it by myself.

I need to have a hash like this one:

{"name":"Admiral Ackbar"},{"name":"Bail Organa"}

so I need a hash with hashes inside.

If I make

myhash.merge ({"name" => "Bail Organa"})

all I get it's just the last pair, since it's updating it everytime.

How can I have a hash like the first one?

I'm sure someone had this problem before.

Thanks in advance.

Regards,
Antonio
Posted by Peter Hickman (Guest)
on 2010-09-01 17:43
(Received via mailing list)
Firstly hash notation is {"name" => "Admiral Ackbar"} and not
{"name":"Admiral Ackbar"} (are you thinking about PHP or Python by
chance?)

To be honest it looks more like you need an Array of hashes.

data = Array.new
data << {"name" => "Admiral Ackbar"}
data << {"name" => "Bail Organa"}

puts data.inspect
=> [{"name"=>"Admiral Ackbar"}, {"name"=>"Bail Organa"}]
Posted by senyi Bojorquez (Guest)
on 2010-09-01 17:55
(Received via mailing list)
Hi Peter
You have to do something like this:

hash = {}
hash[:name] = 'Senyi'
array = []
array << hash
hash2 = {}
hash2[:name] = 'Peter'
array << hash2

=> [{:name=>"Senyi"}, {:name=>"Peter"}]

I hope it helps you
                                                                                                                             Senyi
Posted by Brian Candler (candlerb)
on 2010-09-01 19:31
Antonio Fernández vara wrote:
> I need to have a hash like this one:
> 
> {"name":"Admiral Ackbar"},{"name":"Bail Organa"}

Why a hash? If it only contains names, then why not

names = ["Admiral Ackbar", "Bail Organa"]

Or so you want a hash with multiple values for one key:
{"name"=>["Admiral Ackbar","Bail Organa"]}

myhash = Hash.new { |h,k| h[k] = [] }

myhash["name"] << "Admiral Ackbar"
myhash["name"] << "Bail Organa"

Otherwise, as others have suggested, an array of hashes:

[{"name"=>"Admiral Ackbar","age"=>30},
 {"name"=>"Bail Organa","age"=>65}]

Or choose some attribute as a key, like id

{ 1 => {"name"=>"Admiral Ackbar","age"=>30},
  2 => {"name"=>"Bail Organa","age"=>65}}
Posted by F. Senault (Guest)
on 2010-09-02 12:20
(Received via mailing list)
Le 01 septembre à 17:43, Peter Hickman a écrit :

> data = Array.new
> data << {"name" => "Admiral Ackbar"}
> data << {"name" => "Bail Organa"}

C'mon, where's the fun in that ?  :)

>> require "ostruct"
=> true
>> a = []
=> []
>> a << OpenStruct.new(:name => "Admiral Ackbar", :age => 30)
=> [#<OpenStruct name="Admiral Ackbar", age=30>]
>> a << OpenStruct.new(:name => "Bail Organa", :age => 65)
=> [#<OpenStruct name="Admiral Ackbar", age=30>, #<OpenStruct name="Bail 
Organa", age=65>]
>> a[0].name
=> "Admiral Ackbar"
>> a[1].age
=> 65
>> a.find { |e| e.age > 50 }
=> #<OpenStruct name="Bail Organa", age=65>

Fred
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.