题 如何将ActiveRecord结果转换为哈希数组


我有一个查找操作的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响应。我怎样才能做到这一点?


78
2018-03-15 08:40


起源


也可以看看 stackoverflow.com/q/20794398/165673 - Yarin


答案:


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 with 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

148
2018-03-25 19:40



+1建议serializable_hash - 这是我第一次遇到提及这个问题的答案。遗憾的是,我目前正在使用最新的JSON解决方案,但现在将使用serializable_hash。我只需要找出如何在每个记录中包含类名,如果在JSON中包含root,则可能会得到相同的结果。 - Jurgen
@Dom웃如果我理解正确,请看: stackoverflow.com/questions/17090891/... - hdorio
@Dom在下面看到我的答案。 - Fredrik E
另一种可能的方式是 tasks_records = TaskStoreStatus.all.map(&:attributes)。 - Rigo


也许?

result.map(&:attributes)

如果您需要符号键:

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

23
2017-07-19 07:36





对于当前的ActiveRecord(4.2.4+),有一种方法 to_hash 在...上 Result 返回哈希数组的对象。然后,您可以映射它并转换为符号化哈希:

# 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文档


4
2018-06-20 19:33



不能比这更简单,更清晰。非常感谢你。 - W.M.