如何计算哈希红宝石内部数组的总和

时间:2019-08-14 04:57:21

标签: ruby-on-rails arrays ruby hash

海,我正在使用我的数据创建一个json文件,我需要计算将其保存到数据库中之前的小时数

我正在将该哈希分配给变量有效负载,并尝试执行此操作,但是它返回了一个错误TypeError(没有将Symbol隐式转换为Integer):

total_hours = @payload.sum{|activity| activity[:hours].to_f}

转换为json之前的哈希

{:activities=>
  [{:project=>1,
    :activity=>"my activity",
    :hours=>0.2e1,
    :date=>Sat, 10 Aug 2019 00:00:00 UTC +00:00},
   {:project=>2,
    :activity=>"Tester",
    :hours=>0.2e1,
    :date=>Thu, 01 Aug 2019 00:00:00 UTC +00:00},
   {:project=>2,
    :activity=>"Tester",
    :hours=>0.3e1,
    :date=>Thu, 01 Aug 2019 00:00:00 UTC +00:00}]}

我需要对散列中数组的小时数求和。谢谢

2 个答案:

答案 0 :(得分:2)

如果您使用的是Rails,这是一个简短的方法:

@payload[:activities].pluck(:hours).reduce(:+)

答案 1 :(得分:1)

您应该使用:

total_hours = @payload[:activities].sum{|activity| activity[:hours].to_f}

您知道,您实际上想做的是:

[
  {
    :project=>1,
    :activity=>"my activity",
    :hours=>0.2e1,
    :date=>Sat, 10 Aug 2019 00:00:00 UTC +00:00
  },
  {
    :project=>2,
    :activity=>"Tester",
    :hours=>0.2e1,
    :date=>Thu, 01 Aug 2019 00:00:00 UTC +00:00
  },
  {
    :project=>2,
    :activity=>"Tester",
    :hours=>0.3e1,
    :date=>Thu, 01 Aug 2019 00:00:00 UTC +00:00
  }
].sum{|activity| activity[:hours].to_f}

但是,您正在.sum变量上调用@payload,该变量是一个哈希。您想要的是与键:activities关联的哈希值。因此,您需要在.sum上调用@payload[:activities],其中@payload[:activities]返回上面的数组。