Skip to main content

nested_transform_keys

🔄 Nested transform_keys and transform_values​

ActiveSupport adds transform_keys/transform_values, but they don’t recurse by default. Create recursive variants to normalize keys or values at all depths.

class ::Hash
def deep_transform_keys(&block)
result = {}
each do |key, value|
new_key = block.call(key)
new_val = value.is_a?(Hash) ? value.deep_transform_keys(&block) : value
result[new_key] = new_val
end
result
end
end

snake_hash = { 'UserName' => { 'ProfileImage' => 'url' } }
snake_hash.deep_transform_keys { |k| k.to_s.gsub(/([a-z])([A-Z])/, '\1_\2').downcase }
# => {"user_name"=>{"profile_image"=>"url"}}