Angenommen, ich habe ein Gift
Objekt mit @name = "book"
& @price = 15.95
. Was ist der beste Weg, um dies {name: "book", price: 15.95}
in Ruby in Hash umzuwandeln , nicht in Rails (obwohl Sie auch gerne die Antwort von Rails geben können)?
ruby
object
hashmap
instance-variables
ma11hew28
quelle
quelle
Gift
ist genau so, wie @nash es definiert hat , außer 2) sicher, dass die Instanzvariablen Reader-Accessoren haben können. 3) Alle Attribute im Geschenk.Antworten:
Alternativ mit
each_with_object
:quelle
var.to_s.delete("@")
mitvar[1..-1].to_sym
Symbolen zu erhalten.gift.instance_variables.each_with_object({}) { |var,hash| hash[var.to_s.delete("@")] = gift.instance_variable_get(var) }
und; hash
each
.map
undinject
sind viel mächtiger. Dies ist ein Designproblem, das ich mit Ruby habe:map
undinject
mit dem ich implementiert bineach
. Es ist einfach schlechte Informatik.hash = Hash[gift.instance_variables.map { |var| [var.to_s[1..-1], gift.instance_variable_get(var)] } ]
Sagen Sie einfach (aktuelles Objekt)
.attributes
.attributes
gibt ahash
von any zurückobject
. Und es ist auch viel sauberer.quelle
.values
: sequel.jeremyevans.net/rdoc/classes/Sequel/Model/…instance_values
kann für alle Ruby-Objekte für die ähnliche Ausgabe verwendet werden.Implementieren
#to_hash
?quelle
Use :: for describing class methods, # for describing instance methods, and use . for example code
(Quelle: ruby-doc.org/documentation-guidelines.html ) In der offiziellen Dokumentation (wie dem Ruby CHANGELOG, github.com/ruby/ruby/blob/v2_1_0/NEWS ) werden#
beispielsweise Methoden und der Punkt verwendet für Klassenmethoden ziemlich konsequent.each_with_object
instance_variables.each_with_object(Hash.new(0)) { |element, hash| hash["#{element}".delete("@").to_sym] = instance_variable_get(element) }
quelle
instance_values
. Beachten Sie, dass Matt nach einem Ruby-Weg gefragt hat, insbesondere nicht nach Rails.Sie können
as_json
Methode verwenden. Es wird Ihr Objekt in Hash konvertieren.Dieser Hash wird jedoch als Wert für den Namen dieses Objekts als Schlüssel verwendet. In deinem Fall,
Wenn Sie einen Hash benötigen, der im Objekt gespeichert ist, verwenden Sie
as_json(root: false)
. Ich denke, standardmäßig wird root falsch sein. Weitere Informationen finden Sie im offiziellen Ruby-Leitfadenhttp://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
quelle
Für aktive Datensatzobjekte
und dann einfach anrufen
quelle
Wenn Sie sich nicht in einer Rails-Umgebung befinden (dh ActiveRecord nicht verfügbar haben), kann dies hilfreich sein:
quelle
quelle
Sie können eine sehr elegante Lösung mit einem funktionalen Stil schreiben.
quelle
Sie sollten die
inspect
Methode Ihres Objekts überschreiben , um den gewünschten Hash zurückzugeben, oder einfach eine ähnliche Methode implementieren, ohne das Standardobjektverhalten zu überschreiben.Wenn Sie schicker werden möchten, können Sie die Instanzvariablen eines Objekts mit object.instance_variables durchlaufen
quelle
Recursively Ihre Objekte Hash konvertieren mit 'hashable' gem ( https://rubygems.org/gems/hashable ) Beispiel
quelle
Vielleicht möchten Sie es versuchen
instance_values
. Das hat bei mir funktioniert.quelle
Erzeugt eine flache Kopie als Hash-Objekt nur der Modellattribute
Überprüfen Sie den Typ des resultierenden Objekts
quelle
Wenn Sie auch verschachtelte Objekte konvertieren möchten.
quelle
Gift.new.attributes.symbolize_keys
quelle
Um dies ohne Rails zu tun, besteht eine saubere Möglichkeit darin, Attribute auf einer Konstanten zu speichern.
Um eine Instanz von
Gift
in eine zu konvertierenHash
, können Sie:Dies ist ein guter Weg, da dies nur das enthält, was Sie definieren
attr_accessor
, und nicht jede Instanzvariable.quelle
Ich habe angefangen, Strukturen zu verwenden, um Hash-Konvertierungen zu vereinfachen. Anstatt eine bloße Struktur zu verwenden, erstelle ich meine eigene Klasse, die aus einem Hash abgeleitet ist. Auf diese Weise können Sie Ihre eigenen Funktionen erstellen und die Eigenschaften einer Klasse dokumentieren.
quelle