Rails将计算出的哈希数组转换为嵌套数组

时间:2017-02-28 19:24:52

标签: ruby-on-rails arrays postgresql hash attributes

此查询响应包含计算的delta对,以便我不必在数据库中不必要地创建另一列。

records = [
  {"credential_id"=>1, "followers_count"=>10000, "created_at"=>"2017-02-26 18:50:20.654996", "delta"=>nil}, 
  {"credential_id"=>1, "followers_count"=>12000, "created_at"=>"2017-02-27 18:50:20.654996", "delta"=>2000}, 
  {"credential_id"=>1, "followers_count"=>15000, "created_at"=>"2017-02-28 18:50:20.654996", "delta"=>3000}
]

期望的结果:

deltas = [
  [2017-02-26 18:50:20.654996, nil],
  [2017-02-27 18:50:20.654996, 2000],
  [2017-02-28 18:50:20.654996, 3000]
]

尝试 - 但是,我认为:delta不属于模型/表的事实阻止我使用以下解决方案:.pluck(:created_at, :delta),{{ 1}}和

.values_at("created_at", "delta")

我已经没有尝试过的解决方案了。你能帮我找到想要的结果吗?

3 个答案:

答案 0 :(得分:1)

这很简单:

records.map { |h| [h['created_at'], h['delta']] }
 => [["2017-02-26 18:50:20.654996", nil], 
     ["2017-02-27 18:50:20.654996", 2000], 
     ["2017-02-28 18:50:20.654996", 3000]]

在Ruby中,您可以通过在括号中传递键名来访问哈希值,就像在这个例子中一样。

或者您可以使用Hash#values_at

records.map { |h| h.values_at('created_at', 'delta') }

并获得相同的结果。

答案 1 :(得分:0)

您只需要使用.map迭代记录哈希,然后分配' created_at'和' delta'字段到新数组。 Array#map允许您随时改变起始对象。

records.map {|r| [r['created_at'], r['delta']]}

来自文档:

  

阵列#地图

     

创建一个包含块返回值的新数组。

Ruby Docs for map

答案 2 :(得分:0)

用字符串替换属性符号:

attributes = ['created_at', 'delta']