Ich habe das folgende Objekt, das erstellt wurde
@post = Post.create(:name => 'test', :post_number => 20, :active => true)
Sobald dies gespeichert ist, möchte ich in der Lage sein, das Objekt wieder in einen Hash zu versetzen, z. B. indem ich Folgendes tue:
@object.to_hash
Wie ist das innerhalb von Schienen möglich?
ruby-on-rails
ruby
ben morgan
quelle
quelle
.to_json
wird DB abfragen, wenn das Modell nicht vollständig istjoins
undselect
,Person.joins(:address).select("addresses.street, persons.name").find_by_id(id).attributes
wird zurückkehren{ street: "", name: "" }
as_json
, wird er aufrufenserializable_hash
, der wiederum aufruftattributes
! Ihr Rat ist also, zwei Komplexitätsebenen hinzuzufügenattributes
, was es noch teurer macht..as_json
wird das Objekt zu Ruby Hash serialisierenIn der neuesten Version von Rails (kann jedoch nicht genau sagen, welche) können Sie die folgende
as_json
Methode verwenden:Wird ausgegeben:
Um noch ein bisschen weiter zu gehen, können Sie diese Methode überschreiben, um die Darstellung Ihrer Attribute anzupassen, indem Sie Folgendes tun:
Dann wird mit derselben Instanz wie oben Folgendes ausgegeben:
Dies bedeutet natürlich, dass Sie explizit angeben müssen, welche Attribute angezeigt werden müssen.
Hoffe das hilft.
EDIT:
Sie können auch den Hash- Edelstein überprüfen .
quelle
as_json bietet eine sehr flexible Möglichkeit, komplexe Objekte gemäß Modellbeziehungen zu konfigurieren
BEISPIEL
Modell Kampagne gehört zu Geschäft und hat eine Liste
Modell - Liste hat viele list_tasks und jeder von list_tasks hat viele Kommentare
Wir können einen JSON bekommen, der all diese Daten leicht kombiniert.
Hinweismethoden :: Mithilfe von Tags können Sie zusätzliche Objekte anhängen, die keine Beziehung zu anderen haben. Sie müssen nur eine Methode mit Namen definieren Tags in Modell - Kampagne . Diese Methode sollte alles zurückgeben, was Sie benötigen (z. B. Tags.all).
Offizielle Dokumentation für as_json
quelle
to_
Variante scheintas_
bis auf die angegebene Ausgabe fast genauso zu funktionieren wie die Variante. Das einzige, was mir nicht gefallen hat, war, die Reihenfolge meiner Filterkriterien nicht beizubehalten. Es scheint alphabetisch sortiert zu sein. Ich dachte, das hängt mit dem Juwel awesome_print zusammen, das ich in meiner Umgebung habe, aber ich glaube nicht, dass dies der Fall ist.Sie können die Attribute eines Modellobjekts entweder als Hash zurückgeben
oder
as_json
Mit dieser Option können Sie Zuordnungen und deren Attribute einschließen sowie angeben, welche Attribute ein- / ausgeschlossen werden sollen (siehe Dokumentation ). Wenn Sie jedoch nur die Attribute des Basisobjekts benötigen, zeigt das Benchmarking in meiner App mit Ruby 2.2.3 und Rails 4.2.2, dass diesattributes
weniger als die Hälfte der Zeit erfordertas_json
.quelle
Hier gibt es einige großartige Vorschläge.
Ich denke, es ist erwähnenswert, dass Sie ein ActiveRecord-Modell wie folgt als Hash behandeln können:
Anstatt einen Hash der Attribute zu generieren, können Sie daher das Objekt selbst als Hash verwenden.
quelle
Sie können die Attribute definitiv verwenden, um alle Attribute zurückzugeben, aber Sie können Post eine Instanzmethode hinzufügen, sie "to_hash" nennen und die gewünschten Daten in einem Hash zurückgeben lassen. Etwas wie
quelle
Ich bin mir nicht sicher, ob du das brauchst, aber versuche es in der Ruby-Konsole:
Offensichtlich wird es Ihnen einen Hash in der Konsole zurückgeben. Wenn Sie einen Hash innerhalb einer Methode zurückgeben möchten, verwenden Sie statt "h" "return h.inspect".
quelle
Meine Lösung:
quelle
Swanands Antwort ist großartig.
Wenn Sie FactoryGirl verwenden, können Sie die
build
Methode verwenden, um den Attribut-Hash ohne den Schlüssel zu generierenid
. z.Bquelle
Alte Frage, aber stark referenziert ... Ich denke, die meisten Leute verwenden andere Methoden, aber es gibt tatsächlich eine
to_hash
Methode, die richtig eingerichtet werden muss. Im Allgemeinen ist das Zupfen nach Schienen 4 eine bessere Antwort. Dies zu beantworten, hauptsächlich, weil ich einen Haufen durchsuchen musste, um diesen Thread oder irgendetwas Nützliches zu finden und davon auszugehen, dass andere das gleiche Problem haben ...Hinweis: Dies wird nicht für alle empfohlen, sondern für Randfälle!
Aus dem Rubin auf Schienen api ... http://api.rubyonrails.org/classes/ActiveRecord/Result.html ...
quelle