def convert_hash(hash, path = "") hash.each_with_object({}) do |(k, v), ret| key = path + k if v.is_a? Hash ret.merge! convert_hash(v, key + ".") else ret[key] = v end end end my_hash = {'a' => {'b' => 'a-b', 'c' => 'a-c', 'd' => {'e' => 'a-d-e'} }, 'f' => 'f'} data = convert_hash(my_hash) # => {"a.b"=>"a-b", "a.c"=>"a-c", "a.d.e"=>"a-d-e", "f"=>"f"} data["a.b"] # => "a-b"