So konvertieren Sie ActiveRecord-Ergebnisse in ein Array von Hashes


112

Ich habe ein ActiveRecord-Ergebnis einer Suchoperation:

tasks_records = TaskStoreStatus.find(
  :all,
  :select => "task_id, store_name, store_region",
  :conditions => ["task_status = ? and store_id = ?", "f", store_id]
)

Jetzt möchte ich diese Ergebnisse in eine Reihe von Hashes wie diesen konvertieren:

[0] ->  { :task_d => 10, :store_name=> "Koramanagala", :store_region=> "India" }

[1] -> { :task_d => 10, :store_name=> "Koramanagala", :store_region=> "India" }

[2] ->  { :task_d => 10, :store_name=> "Koramanagala", :store_region=> "India" }

Damit kann ich das Array durchlaufen und weitere Elemente zu Hashes hinzufügen und später das Ergebnis JSONfür meine API-Antwort konvertieren . Wie kann ich das machen?


Antworten:


210

as_json

Sie sollten eine as_jsonMethode verwenden, die ActiveRecord-Objekte trotz ihres Namens in Ruby Hashes konvertiert

tasks_records = TaskStoreStatus.all
tasks_records = tasks_records.as_json

# You can now add new records and return the result as json by calling `to_json`

tasks_records << TaskStoreStatus.last.as_json
tasks_records << { :task_id => 10, :store_name => "Koramanagala", :store_region => "India" }
tasks_records.to_json

serializable_hash

Sie können auch alle ActiveRecord-Objekte in einen Hash mit serializable_hashkonvertieren und alle ActiveRecord-Ergebnisse in ein Array mit konvertieren. to_aBeispiel:

tasks_records = TaskStoreStatus.all
tasks_records.to_a.map(&:serializable_hash)

Und wenn Sie eine hässliche Lösung für Rails vor v2.3 wollen

JSON.parse(tasks_records.to_json) # please don't do it

4
+1 Für den Vorschlag von serializable_hash - dies ist das erste Mal, dass ich auf eine Antwort stoße, die dies erwähnt. Leider verwende ich derzeit die letzte JSON-Lösung, werde mich aber jetzt mit serializable_hash befassen. Ich muss nur herausfinden, wie der Klassenname in jeden Datensatz eingefügt werden kann, wie Sie es möglicherweise erhalten, wenn Sie root in JSON einfügen.
Dom

@ Dom 웃 Wenn ich das richtig verstehe, sehe ich das: stackoverflow.com/questions/17090891/…
hdorio

@ Dom siehe meine Antwort unten.
Fredrik E

Ein anderer möglicher Weg ist tasks_records = TaskStoreStatus.all.map(&:attributes).
Rigo

Wirklich große Lösungen hier, aber meine Frage könnte Was sind die Vorteile der Verwendung von entweder .as_json, &:serializable_hashund &:attributes? Hat es mit ActiveRecord-Helfern oder direkt mit der Leistung zu tun? Danke im Voraus Jungs! @Dom @Rigo @Fredrik E
alexventuraio

35

Vielleicht?

result.map(&:attributes)

Wenn Sie Symboltasten benötigen:

result.map { |r| r.attributes.symbolize_keys }

9

Für den aktuellen ActiveRecord (4.2.4+) gibt es eine Methode to_hashfür das ResultObjekt, die ein Array von Hashes zurückgibt. Sie können es dann zuordnen und in symbolisierte Hashes konvertieren:

# Get an array of hashes representing the result (column => value):
result.to_hash
# => [{"id" => 1, "title" => "title_1", "body" => "body_1"},
      {"id" => 2, "title" => "title_2", "body" => "body_2"},
      ...
     ]

result.to_hash.map(&:symbolize_keys)
# => [{:id => 1, :title => "title_1", :body => "body_1"},
      {:id => 2, :title => "title_2", :body => "body_2"},
      ...
     ]

Weitere Informationen finden Sie in den ActiveRecord :: Result-Dokumenten .


Einfacher und klarer kann es nicht sein. Vielen Dank.
WM

1
Ein Hinweis, wenn Ihre Version von ActiveRecord die to_hashMethode nicht erkennt : Versuchen Sie es to_arystattdessen. Seltsamerweise hat das bei mir funktioniert.
Phil
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.