Skip to content

Instantly share code, notes, and snippets.

@nddeluca
Created April 8, 2015 14:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nddeluca/44e07faac0b922c94a20 to your computer and use it in GitHub Desktop.
Save nddeluca/44e07faac0b922c94a20 to your computer and use it in GitHub Desktop.
Hash Key Conversions
class Hash
def to_underscore
convert_keys(self, :underscore)
end
def to_camel_case
convert_keys(self, :camelize, :lower)
end
def to_underscore!
convert_keys!(self, :underscore)
end
def to_camel_case!
convert_keys!(self, :camelize, :lower)
end
private
def convert_keys(obj, *methods)
case obj
when Hash
obj.inject({}) do |hash, (key, value)|
value = convert_keys(value, *methods)
_format_key_and_set_value(hash, key, value, *methods)
end
when Array
obj.map { |m| convert_keys(m, *methods) }
else
obj
end
end
def convert_keys!(obj, *methods)
case obj
when Hash
obj.keys.each do |key, value = obj[key]|
value = convert_keys!(value, *methods)
obj.delete(key)
_format_key_and_set_value(obj, key, value, *methods)
end
obj
when Array
obj.map { |m| convert_keys!(m, *methods) }
else
obj
end
end
def _format_key_and_set_value(hash, key, value, *methods)
case key
when String
hash[key.send(*methods)] = value
when Symbol
hash[key.to_s.send(*methods).to_sym] = value
end
hash
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment