136 votes

Comment convertir les résultats d'ActiveRecord en un tableau de hashs ?

J'ai un résultat ActiveRecord d'une opération de recherche :

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

Maintenant, je veux convertir ces résultats en un tableau de hachages comme ceci :

[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" }

afin de pouvoir itérer dans le tableau et ajouter des éléments supplémentaires aux hachages, puis convertir le résultat en format JSON pour ma réponse API. Comment puis-je faire cela ?

246voto

hdorio Points 3332

As_json

Vous devez utiliser as_json qui convertit les objets ActiveRecord en hachages Ruby, malgré son nom.

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

sérialisable_hash

Vous pouvez également convertir tout objet ActiveRecord en un Hash avec serializable_hash et vous pouvez convertir n'importe quel résultat ActiveRecord en un tableau avec to_a Donc, pour votre exemple :

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

Et si vous voulez une solution moche pour les Rails antérieurs à la v2.3

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

48voto

Elena Unanyan Points 746

Peut-être ?

result.map(&:attributes)

Si vous avez besoin de clés de symboles :

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

15voto

sventechie Points 554

Pour ActiveRecord actuel (4.2.4+) il y a une méthode to_hash sur le Result qui renvoie un tableau de hachages. Vous pouvez ensuite le mapper et le convertir en hachages symbolisés :

# 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"},
      ...
     ]

Voir la documentation d'ActiveRecord::Result pour plus d'informations. .

1voto

essayez celui-ci :-

données \= Nom du modèle . dernier

attributs.de.données

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X