如何将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" }

这样我就可以遍历数组,并向哈希添加更多元素,然后将结果转换JSON为API响应。我怎样才能做到这一点?


Answers:


210

as_json

您应该使用as_json将ActiveRecord对象名称转换为Ruby Hashes的方法

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对象转换为Hash,serializable_hash并且可以将任何ActiveRecord结果转换为Array 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中包含root时所得到的一样。
2013年

@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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.