Digamos que tengo un Giftobjeto 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

Giftes 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_sympara 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; hasheach.mapyinjectson mucho más poderosos Este es un problema de diseño que tengo con Ruby:mapy queinjectse 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.attributesdevuelve unohashde cualquieraobject. Y es mucho más limpio también.fuente
.values: sequel.jeremyevans.net/rdoc/classes/Sequel/Model/…instance_valuesse 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_jsonmé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
inspectmé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
GiftaHash, puede:Esta es una buena manera de hacerlo porque solo incluirá lo que defina
attr_accessory 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