Рассмотрим следующий код:
hash1 = {"one" => 1, "two" => 2, "three" => 3}
hash2 = hash1.reduce({}){ |h, (k,v)| h.merge(k => hash1) }
hash3 = hash2.reduce({}){ |h, (k,v)| h.merge(k => hash2) }
hash4 = hash3.reduce({}){ |h, (k,v)| h.merge(k => hash3) }
hash4 является "вложенным" хешем, т.е. хешем со строковыми ключами и аналогичными "вложенными" хеш-значениями.
Метод "symbolize_keys" для Hash in Rails позволяет нам легко преобразовывать строковые ключи в символы. Но я ищу способ элегантный преобразовать все ключи (первичные ключи плюс ключи всех хэшей в хэш-хэш) в символы.
Суть заключается в том, чтобы спасти себя от моего (imo) уродливого решения:
class Hash
def symbolize_keys_and_hash_values
symbolize_keys.reduce({}) do |h, (k,v)|
new_val = v.is_a?(Hash) ? v.symbolize_keys_and_hash_values : v
h.merge({k => new_val})
end
end
end
hash4.symbolize_keys_and_hash_values #=> desired result
FYI: Setup - это Rails 3.2.17 и Ruby 2.1.1
Обновление:
Ответ hash4.deep_symbolize_keys
для Rails <= 5.0
Ответ JSON.parse(JSON[hash4], symbolize_names: true)
для Rails > 5