Это не попытка дать вам лучший способ сделать это, но это способ: P
def flatten(hash)
return {[] => hash} if !hash.is_a?(Hash)
map = {}
hash.each_pair do |key1, value1|
flatten(value1).each_pair do |key2, value2|
map[[key1] + key2] = value2
end
end
return map
end
Это работает для вашего примера, давая такой результат:
{[:a, :b, :c]=>1, [:a, :b, :d]=>2, [:a, :e]=>3, [:f]=>4}
Может не дать ожидаемого результата, если есть пустые хэши.