This is a migration from my old blog post which sadly I have to take
down.

I find that I need this quite often, say if I have a hash like this:

1
2
3
4
5
6
hash = {
top: 'top level',
level1: {
level2: 'level 2'
}
}

and I want to access the hash like this:

1
obj.level1.level2 # => 'level 2'

so I use this class (taken form here to get what I want.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require 'ostruct'

class DeepObject < OpenStruct

def initialize(hash)
@original = hash
hash.each do |k,v|
v = DeepObject.new(v) if v.is_a?(::Hash)
hash[k] = v
end
super
end

def to_hash
@original
end
end

and I use it like this:

1
2
3
4
deepobject = DeepObject.new(hash)
deepobject.top # => 'top level'
deepobject.level1.level2 # => 'level 2'
deepobject.level1.to_hash # => { :level2 => 'level 2' } }