Renomear chaves Hash

Ao lidar com objetos hashificados que são enviados para uma API externa, os nomes das variáveis ​​de instância originais podem não estar em conformidade com essa API. Renomear todas as chaves Hash resolveria, felizmente o Ruby nos abençoa com métodos incríveis, como each with object, que itera o bloco fornecido para cada elemento com um objeto arbitrário fornecido e retorna o objeto inicialmente fornecido.

Mostre-me algum código!

Considere a seguinte classe:

class Dog
attr_accessor
:name, :breed, :owner_name, :birth_place

def initialize(opts = {})
@name ||= opts[:name]
@breed ||= opts[:breed]
@owner_name ||= opts[:owner_name]
@birth_place ||= opts[:birth_place]
end

def attributes
Hash[instance_variables.map { |name, _| [name.to_s.sub!(%r{@}, '').to_sym, instance_variable_get(name)] }]
end
end

Isso nos dá um objeto hashificado parecido com este:

> dog = Dog.new({name: 'John', breed: 'labrador', owner_name: 'Peter', birth_place: 'Canada'})
=>#<Dog:0x00000003381578 @name="John", @breed="labrador", @owner_name="Peter", @birth_place="Canada">
> hsh = dog.attributes
=> {:name=>"John", :breed=>"labrador", :owner_name=>"Peter", :birth_place=>"Canada"}

Nossa API não permite chaves snake-case ou camel-case, portanto, precisamos nos livrar delas

def remove_snake_case(word)
conversion
= word.to_s.gsub(/_/, '')

return conversion.to_sym if word.is_a?(Symbol)

conversion

end

each_with_object para o resgate!

> hsh.each_with_object({}) {|(key, value), obj| obj[remove_snake_case(key)] = value}
=> {:name=>"John", :breed=>"labrador", :ownername=>"Peter", :birthplace=>"Canada"}

Ruby não é ótimo?