Disons que j'ai un Gift
objet avec @name = "book"
& @price = 15.95
. Quelle est la meilleure façon de convertir cela en Hash {name: "book", price: 15.95}
dans Ruby, pas en Rails (bien que n'hésitez pas à donner la réponse Rails aussi)?
ruby
object
hashmap
instance-variables
ma11hew28
la source
la source
Gift
est exactement comme @nash a défini , sauf, 2) bien sûr, les variables d'instance peuvent avoir des accesseurs de lecture. 3) Tous les attributs du cadeau.Réponses:
Alternativement avec
each_with_object
:la source
var.to_s.delete("@")
parvar[1..-1].to_sym
pour obtenir des symboles.gift.instance_variables.each_with_object({}) { |var,hash| hash[var.to_s.delete("@")] = gift.instance_variable_get(var) }
et se débarrasser de la traîne; hash
each
.map
etinject
sont beaucoup plus puissants. C'est un problème de conception que j'ai avec Ruby:map
etinject
sont implémentés aveceach
. C'est tout simplement une mauvaise informatique.hash = Hash[gift.instance_variables.map { |var| [var.to_s[1..-1], gift.instance_variable_get(var)] } ]
Dites simplement (objet actuel)
.attributes
.attributes
renvoie ahash
de anyobject
. Et c'est aussi beaucoup plus propre.la source
.values
: sequel.jeremyevans.net/rdoc/classes/Sequel/Model/…instance_values
peut être utilisé pour tous les objets ruby pour une sortie similaire.Mettre en œuvre
#to_hash
?la source
Use :: for describing class methods, # for describing instance methods, and use . for example code
(source: ruby-doc.org/documentation-guidelines.html ) De plus, la documentation officielle (comme le ruby CHANGELOG, github.com/ruby/ruby/blob/v2_1_0/NEWS ) utilise#
par exemple des méthodes et le point pour les méthodes de classe de manière assez cohérente.each_with_object
:instance_variables.each_with_object(Hash.new(0)) { |element, hash| hash["#{element}".delete("@").to_sym] = instance_variable_get(element) }
la source
instance_values
. Notez que Matt a demandé un moyen Ruby, en particulier pas Rails.Vous pouvez utiliser la
as_json
méthode. Cela convertira votre objet en hachage.Mais, ce hachage viendra en tant que valeur du nom de cet objet en tant que clé. Dans ton cas,
Si vous avez besoin d'un hachage stocké dans l'objet, utilisez
as_json(root: false)
. Je pense que la racine par défaut sera fausse. Pour plus d'informations, reportez-vous au guide officiel de rubishttp://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
la source
Pour les objets d'enregistrement actifs
et puis juste appeler
la source
Si vous n'êtes pas dans un environnement Rails (c'est-à-dire que vous n'avez pas ActiveRecord disponible), cela peut être utile:
la source
la source
Vous pouvez écrire une solution très élégante en utilisant un style fonctionnel.
la source
Vous devez remplacer la
inspect
méthode de votre objet pour renvoyer le hachage souhaité, ou simplement implémenter une méthode similaire sans remplacer le comportement par défaut de l'objet.Si vous voulez être plus sophistiqué, vous pouvez parcourir les variables d'instance d'un objet avec object.instance_variables
la source
Convertissez récursivement vos objets en hachage en utilisant un gem 'hashable' ( https://rubygems.org/gems/hashable ) Exemple
la source
Je veux peut-être essayer
instance_values
. Cela a fonctionné pour moi.la source
Produit une copie superficielle en tant qu'objet de hachage des seuls attributs du modèle
Vérifiez le type de l'objet résultant
la source
Si vous avez également besoin de convertir des objets imbriqués.
la source
Gift.new.attributes.symbolize_keys
la source
Pour ce faire sans Rails, une méthode propre consiste à stocker les attributs sur une constante.
Et puis, pour convertir une instance de
Gift
en aHash
, vous pouvez:C'est un bon moyen de le faire car il n'inclura que ce que vous définissez
attr_accessor
, et non toutes les variables d'instance.la source
J'ai commencé à utiliser des structures pour faciliter les conversions de hachage. Au lieu d'utiliser une structure nue, je crée ma propre classe dérivée d'un hachage, cela vous permet de créer vos propres fonctions et de documenter les propriétés d'une classe.
la source