ActiveRecordの結果をハッシュの配列に変換する方法


112

検索操作のActiveRecord結果があります。

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

この結果を次のようなハッシュの配列に変換したいと思います。

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

配列を反復処理して、ハッシュに要素を追加し、後で結果をJSONAPI応答に変換できるようにします。これどうやってするの?


回答:


210

as_json

as_json名前にかかわらずActiveRecordオブジェクトをRubyハッシュに変換するメソッドを使用する必要があります

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

また、ActiveRecordオブジェクトをハッシュにserializable_hash変換したり、ActiveRecordの結果を配列に変換したりすることもできto_aます。たとえば、次のようにします。

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

また、v2.3より前のRailsの醜いソリューションが必要な場合

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

4
+1 serializable_hashを提案するため-これについて言及する答えに出会ったのはこれが初めてです。悲しいことに、私は現在最後のJSONソリューションを使用していますが、serializable_hashの使用について見ていきます。JSONにルートを含める場合と同じように、各レコードにクラス名を含める方法を見つける必要があります。
Dom

@Dom 웃私は、この参照を正しく理解していれば:stackoverflow.com/questions/17090891/...
hdorio

@Dom以下の私の回答を参照してください。
Fredrik E

別の可能な方法はtasks_records = TaskStoreStatus.all.map(&:attributes)です。
Rigo

本当に素晴らしいこっちのソリューションが、私の質問はできいずれかを使用するメリットは何ですか.as_json&:serializable_hash&:attributes?ActiveRecordヘルパーと直接関係がありますか、それとも直接パフォーマンスと関係がありますか?事前にみんなありがとう!@Dom @Rigo @Fredrik E
alexventuraio


9

現在のActiveRecord(4.2.4+)では、ハッシュの配列を返すメソッドto_hashResultオブジェクトにあります。次に、それをマッピングして、記号化されたハッシュに変換できます。

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

詳細については、ActiveRecord :: Resultのドキュメントをご覧ください


これより単純で明確にすることはできません。どうもありがとうございました。
WM

1
ActiveRecordのバージョンがto_hashメソッドを認識しない場合の注意:to_ary代わりに試してください。不思議なことにこれは私のために働いた。
Phil
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.