Ruby convertit l'Objet de Hachage
Disons que j'ai un Gift
objet avec @name = "book"
& @price = 15.95
. Quel est le meilleur moyen de convertir la valeur de Hachage {name: "book", price: 15.95}
en Ruby, pas de Rails (mais n'hésitez pas à donner les Rails de réponse trop)?
- Aurait @don.les attributs.to_options faire?
- 1) Est un cadeau ActiveRecord objet? 2)peut-on supposer @nom/@prix ne sont pas seulement les variables d'instance, mais aussi lecteur accesseurs? 3) vous voulez que le nom et le prix ou tous les attributs d'un cadeau de ce qu'ils sont?
- 1) non,
Gift
est exactement comme @nash a défini, à l'exception, 2) bien sûr, les variables d'instance lecteur peut avoir des accesseurs. 3) Tous les attributs d'un cadeau. - Ok. La question sur les variables d'instance/lecteurs d'accès était de savoir si l'on voulait un accès extérieur (nash) ou à l'intérieur de la méthode (levinalex). J'ai mis à jour ma réponse pour l ' "intérieur" de la démarche.
Vous devez vous connecter pour publier un commentaire.
Alternativement avec
each_with_object
:var.to_s.delete("@")
avecvar[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 de se débarrasser de l'arrière; hash
each
.map
etinject
sont beaucoup plus puissants. C'est une conception de scrupule que j'ai avec Ruby:map
etinject
sont mis en œuvre aveceach
. C'est tout simplement de la mauvaise science de l'ordinateur.hash = Hash[gift.instance_variables.map { |var| [var.to_s[1..-1], gift.instance_variable_get(var)] } ]
Viens de dire (objet courant)
.attributes
.attributes
renvoie unehash
de touteobject
. Et c'est beaucoup plus propre aussi..values
: sequel.jeremyevans.net/rdoc/classes/Sequel/Model/...instance_values
peut être utilisé pour tous les objets ruby pour le même résultat.Mettre en œuvre
#to_hash
?Use :: for describing class methods, # for describing instance methods, and use . for example code
(source: ruby-doc.org/documentation-guidelines.html), De la documentation officielle (comme le rubis CHANGELOG, github.com/ruby/ruby/blob/v2_1_0/NEWS) utilise#
pour les méthodes d'instance et le point pour les méthodes de classe assez régulièrement.each_with_object
:instance_variables.each_with_object(Hash.new(0)) { |element, hash| hash["#{element}".delete("@").to_sym] = instance_variable_get(element) }
instance_values
. Notez que Matt a demandé un Rubis moyen, ne pas les Rails.Vous pouvez utiliser
as_json
méthode. Il va convertir votre objet dans hachage.Mais, que de hachage viendra comme une valeur pour le nom de l'objet en tant que clé. Dans votre cas,
Si vous avez besoin d'un hachage qui est stockée dans l'objet de l'utilisation
as_json(root: false)
. Je pense que par défaut, la racine sera faux. Pour plus d'informations, reportez-vous officiel ruby guidehttp://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
Pour L'Enregistrement Actif Objets
et puis il suffit d'appeler
Si vous n'êtes pas dans un environnement Rails (ie. n'ont pas ActiveRecord disponibles), ce qui peut être utile:
Vous pouvez écrire une solution élégante à l'aide d'un style fonctionnel.
Vous devez remplacer le
inspect
méthode de votre objet de retour souhaité de hachage, ou tout simplement de mettre en œuvre une méthode similaire, sans écraser la valeur par défaut le comportement d'un objet.Si vous souhaitez obtenir de plus sophistiqué, vous pouvez effectuer une itération sur une instance de l'objet de variables avec objet.instance_variables
De manière récursive convertir vos objets de hachage à l'aide de 'hashable" gem (https://rubygems.org/gems/hashable)
Exemple
Voudrez peut-être essayer
instance_values
. Ce qui a fonctionné pour moi.Produit d'une copie d'un algorithme de hachage de l'objet de tout les attributs de modèle
Vérifier le type de l'objet résultant
Vous devriez essayer Hashie, un petit bijou merveilleux :
https://github.com/intridea/hashie
Si vous avez besoin d'objets imbriqués pour être converties en tant que bien.
Cadeau.de nouvelles.les attributs.symbolize_keys
Pour ce faire, sans Rails, un moyen propre est de stocker les attributs sur une constante.
Et puis, pour convertir une instance de
Gift
à unHash
, vous pouvez:C'est une bonne façon de le faire, car il ne comprendra ce que vous définissez sur
attr_accessor
, et non pas chaque variable d'instance.J'ai commencé à utiliser les structures pour rendre facile pour hacher les conversions.
Au lieu d'utiliser un nu-struct-je créer mon propre classe dérivée à partir d'un hachage cela vous permet de créer vos propres fonctions et les documents les propriétés d'une classe.