Просто разделите точку на пути и повторите итерацию, чтобы найти правильный хеш?
path.split(".").inject(hash) { |hash, key| hash[key] }
В качестве альтернативы вы можете создать новый хеш, рекурсивно повторяя всю структуру:
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