Digamos que eu tenho um Gift
objeto com @name = "book"
& @price = 15.95
. Qual é a melhor maneira de converter isso para o Hash {name: "book", price: 15.95}
em Ruby, não para o Rails (embora fique à vontade para dar a resposta do Rails também)?
ruby
object
hashmap
instance-variables
ma11hew28
fonte
fonte
Gift
é exatamente como o @nash definiu , exceto 2) com certeza, as variáveis da instância podem ter acessadores de leitor. 3) Todos os atributos presentes.Respostas:
Alternativamente com
each_with_object
:fonte
var.to_s.delete("@")
porvar[1..-1].to_sym
para obter símbolos.gift.instance_variables.each_with_object({}) { |var,hash| hash[var.to_s.delete("@")] = gift.instance_variable_get(var) }
e livrar-se da fuga; hash
each
.map
einject
são muito mais poderosos. Este é um aspecto de design que eu tenho com o Ruby:map
einject
é implementado comeach
. É simplesmente ciência da computação ruim.hash = Hash[gift.instance_variables.map { |var| [var.to_s[1..-1], gift.instance_variable_get(var)] } ]
Apenas diga (objeto atual)
.attributes
.attributes
retorna umhash
de qualquerobject
. E é muito mais limpo também.fonte
.values
: sequel.jeremyevans.net/rdoc/classes/Sequel/Model/...instance_values
pode ser usado para todos os objetos ruby para uma saída semelhante.Implementar
#to_hash
?fonte
Use :: for describing class methods, # for describing instance methods, and use . for example code
(fonte: ruby-doc.org/documentation-guidelines.html ) Além disso, a documentação oficial (como o ruby CHANGELOG , github.com/ruby/ruby/blob/v2_1_0/NEWS ) usa,#
por exemplo, métodos e o ponto para métodos de classe de maneira bastante consistente.each_with_object
:instance_variables.each_with_object(Hash.new(0)) { |element, hash| hash["#{element}".delete("@").to_sym] = instance_variable_get(element) }
fonte
instance_values
. Note que Matt pediu uma maneira Ruby, especificamente não Rails.Você pode usar o
as_json
método Ele converterá seu objeto em hash.Mas, esse hash será um valor para o nome desse objeto como uma chave. No seu caso,
Se você precisar de um hash armazenado no objeto use
as_json(root: false)
. Eu acho que por padrão a raiz será falsa. Para mais informações, consulte o guia oficial do rubyhttp://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
fonte
Para objetos de registro ativo
e depois é só ligar
fonte
Se você não está em um ambiente Rails (ou seja, não possui o ActiveRecord disponível), isso pode ser útil:
fonte
fonte
Você pode escrever uma solução muito elegante usando um estilo funcional.
fonte
Você deve substituir o
inspect
método do seu objeto para retornar o hash desejado ou apenas implementar um método semelhante sem substituir o comportamento padrão do objeto.Se você quiser ficar mais sofisticado, pode iterar sobre as variáveis de instância de um objeto com object.instance_variables
fonte
Recursively converter seus objetos em Hash usando 'Hashable' gem ( https://rubygems.org/gems/hashable ) Exemplo
fonte
Pode querer tentar
instance_values
. Isso funcionou para mim.fonte
Produz uma cópia superficial como um objeto de hash apenas dos atributos do modelo
Verifique o tipo do objeto resultante
fonte
Se você precisar que objetos aninhados também sejam convertidos.
fonte
Gift.new.attributes.symbolize_keys
fonte
Para fazer isso sem o Rails, uma maneira limpa é armazenar atributos em uma constante.
E então, para converter uma instância de
Gift
para aHash
, você pode:Essa é uma boa maneira de fazer isso, pois incluirá apenas o que você define
attr_accessor
e não todas as variáveis de instância.fonte
Comecei a usar estruturas para facilitar as conversões de hash. Em vez de usar uma estrutura simples, crio minha própria classe derivada de um hash, isso permite que você crie suas próprias funções e documenta as propriedades de uma classe.
fonte