Digamos que tengo un Gift
objeto con @name = "book"
& @price = 15.95
. ¿Cuál es la mejor manera de convertir eso al Hash {name: "book", price: 15.95}
en Ruby, no a Rails (aunque siéntase libre de responder también a los Rails)?
ruby
object
hashmap
instance-variables
ma11hew28
fuente
fuente
Gift
es exactamente como @nash ha definido , excepto que, 2) seguro, las variables de instancia pueden tener accesores de lector. 3) Todos los atributos en regalo.Respuestas:
Alternativamente con
each_with_object
:fuente
var.to_s.delete("@")
convar[1..-1].to_sym
para obtener símbolos.gift.instance_variables.each_with_object({}) { |var,hash| hash[var.to_s.delete("@")] = gift.instance_variable_get(var) }
y deshacerte del final; hash
each
.map
yinject
son mucho más poderosos Este es un problema de diseño que tengo con Ruby:map
y queinject
se implementa coneach
. Es simplemente una mala informática.hash = Hash[gift.instance_variables.map { |var| [var.to_s[1..-1], gift.instance_variable_get(var)] } ]
Solo di (objeto actual)
.attributes
.attributes
devuelve unohash
de cualquieraobject
. Y es mucho más limpio también.fuente
.values
: sequel.jeremyevans.net/rdoc/classes/Sequel/Model/…instance_values
se puede usar para todos los objetos de rubí para la salida similar.Implementar
#to_hash
?fuente
Use :: for describing class methods, # for describing instance methods, and use . for example code
(fuente: ruby-doc.org/documentation-guidelines.html ) Además, la documentación oficial (como ruby CHANGELOG, github.com/ruby/ruby/blob/v2_1_0/NEWS ) utiliza#
métodos de ejemplo y el punto para métodos de clase de manera bastante consistente.each_with_object
:instance_variables.each_with_object(Hash.new(0)) { |element, hash| hash["#{element}".delete("@").to_sym] = instance_variable_get(element) }
fuente
instance_values
. Tenga en cuenta que Matt pidió una manera de Ruby, específicamente no Rails.Puedes usar el
as_json
método. Convertirá tu objeto en hash.Pero, ese hash vendrá como un valor para el nombre de ese objeto como una clave. En tu caso,
Si necesita un hash que está almacenado en el uso del objeto
as_json(root: false)
. Creo que, por defecto, la raíz será falsa. Para obtener más información, consulte la guía oficial de rubyhttp://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
fuente
Para objetos de registro activo
y luego solo llama
fuente
Si no está en un entorno Rails (es decir, no tiene ActiveRecord disponible), esto puede ser útil:
fuente
fuente
Puedes escribir una solución muy elegante usando un estilo funcional.
fuente
Debe anular el
inspect
método de su objeto para devolver el hash deseado, o simplemente implementar un método similar sin anular el comportamiento predeterminado del objeto.Si desea ser más elegante, puede iterar sobre las variables de instancia de un objeto con object.instance_variables
fuente
Convierta recursivamente sus objetos a hash usando gemas 'hashables' ( https://rubygems.org/gems/hashable ) Ejemplo
fuente
Tal vez quiera intentarlo
instance_values
. Eso funcionó para mí.fuente
Produce una copia superficial como un objeto hash de solo los atributos del modelo
Verifique el tipo del objeto resultante
fuente
Si necesita convertir objetos anidados también.
fuente
Gift.new.attributes.symbolize_keys
fuente
Para hacer esto sin Rails, una forma limpia es almacenar atributos en una constante.
Y luego, para convertir una instancia de
Gift
aHash
, puede:Esta es una buena manera de hacerlo porque solo incluirá lo que defina
attr_accessor
y no todas las variables de instancia.fuente
Comencé a usar estructuras para hacer conversiones fáciles de hash. En lugar de utilizar una estructura simple, creo mi propia clase derivada de un hash, esto le permite crear sus propias funciones y documenta las propiedades de una clase.
fuente