How to elegantly symbolize_keys for a ‘nested’ hash

There are a few ways to do this

  1. There’s a deep_symbolize_keys method in Rails

    hash.deep_symbolize_keys!

  2. As mentioned by @chrisgeeq, there is a deep_transform_keys method that’s available from Rails 4.

    hash.deep_transform_keys(&:to_sym)

    There is also a bang ! version to replace the existing object.

  3. There is another method called with_indifferent_access. This allows you to access a hash with either a string or a symbol like how params are in the controller. This method doesn’t have a bang counterpart.

    hash = hash.with_indifferent_access

  4. The last one is using JSON.parse. I personally don’t like this because you’re doing 2 transformations – hash to json then json to hash.

    JSON.parse(JSON[h], symbolize_names: true)

UPDATE:

16/01/19 – add more options and note deprecation of deep_symbolize_keys

19/04/12 – remove deprecated note. only the implementation used in the method is deprecated, not the method itself.

Leave a Comment