6

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?

Nakilon
  • 34,866
  • 14
  • 107
  • 142
Dukeh
  • 73
  • 1
  • 5

5 Answers5

3

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} 
Lars Haugseth
  • 14,721
  • 2
  • 45
  • 49
2

Just this works

object.instance_values

shiva kumar
  • 11,294
  • 4
  • 23
  • 28
1

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.

Cody Caughlan
  • 32,456
  • 5
  • 63
  • 68
0

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]
potatopeelings
  • 40,709
  • 7
  • 95
  • 119
-1

Better use, <object>.attributes

it will returns a hash.

It is much more clean solution.

Cheers!

Manish Shrivastava
  • 30,617
  • 13
  • 97
  • 101