Dukeh
Dukeh

Reputation: 73

Converting an object to a hash of values in Ruby

I have searched around, but can't find any built-in way to do convert an object (of my own creation) to a hash of values, so must needs look elsewhere.

My thought was to use .instance_variables, strip the @ from the front of each variable, and then use the attr_accessor for each to create the hash.

What do you guys think? Is that the 'Ruby Way', or is there a better way to do this?

Upvotes: 6

Views: 5636

Answers (5)

shiva kumar
shiva kumar

Reputation: 11414

Just this works

object.instance_values

Upvotes: 2

Manish Shrivastava
Manish Shrivastava

Reputation: 32050

Better use, <object>.attributes

it will returns a hash.

It is much more clean solution.

Cheers!

Upvotes: -1

Lars Haugseth
Lars Haugseth

Reputation: 14881

Assuming all data you want to be included in the hash is stored in instance variables:

class Foo
  attr_writer :a, :b, :c

  def to_hash
    Hash[*instance_variables.map { |v|
      [v.to_sym, instance_variable_get(v)]
    }.flatten]
  end
end

foo = Foo.new
foo.a = 1
foo.b = "Test"
foo.c = Time.now
foo.to_hash
 => {:b=>"Test", :a=>1, :c=>Fri Jul 09 14:51:47 0200 2010} 

Upvotes: 3

potatopeelings
potatopeelings

Reputation: 41065

do you need a hash? or do you just need the convenience of using a hash?

if you need a has Geoff Lanotte's suggestion in Cody Caughlan's answer is nice. otherwise you could overload [] for your class. something like.

class Test
    def initialize v1, v2, v3
        @a = x
        @b = y
        @c = z
    end

    def [] x
        instance_variable_get("@" + x)
    end
end

n = Test.new(1, 2, 3)
p n[:b]

Upvotes: 1

Cody Caughlan
Cody Caughlan

Reputation: 32748

I dont know of a native way to do this, but I think your idea of basically just iterating over all instance variables and building up a hash is basically the way to go. Its pretty straight-forward.

You can use Object.instance_variables to get an Array of all instance variables which you then loop over to get their values.

Upvotes: 1

Related Questions