对哈希值求和



我有一个模型,我正在将一些相关数据存储在这样的散列中:

line_items_attributes"=>[{"major"=>"8762", "minor"=>"322", "description"=>"Engineering", "amount"=>"200000", "active"=>"1"}, {"major"=>"8762", "minor"=>"445", "description"=>"Tanks", "amount"=>"2100000", "active"=>"1"}, {"major"=>"8762", "minor"=>"500", "description"=>"Pipe, Valves & Fittings", "amount"=>"150000", "active"=>"1"}]

我这样做是为了避免另一个相关的模型等

我喜欢玩这个网站上的原型:

http://daniel.fone.net.nz/blog/2013/10/19/prototyping-web-applications-in-rails-4/?utm_source=rubyweekly&utm_medium=电子邮件

不管怎样,我要所有的"金额"值。我在谷歌上搜索了一些解决方案,但我对哈希的了解还不够。

我试过了:

2.0.0-p247 :053 > line_items_attributes.inject(0) {|sum, hash| sum + hash["amount"]}
TypeError: no implicit conversion of String into Integer
    from (irb):53:in `[]'
    from (irb):53:in `block in irb_binding'
    from (irb):53:in `each'
    from (irb):53:in `inject'
    from (irb):53
    from /Users/dan/.rvm/gems/ruby-2.0.0-p247@global/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
    from /Users/dan/.rvm/gems/ruby-2.0.0-p247@global/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
    from /Users/dan/.rvm/gems/ruby-2.0.0-p247@global/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

我甚至试着添加hash["amount"].to_I,但没有成功。我想我已经接近了,但我肯定错过了一些对更有经验的人来说显而易见的东西。

顺便说一句,我看到了其他散列符号,如:

line_items_attributes"=>[{major:"8762",minor:"322"等。这有优势吗?

这对我有效:

2.0.0p247 :028 > line_items_attributes = [{"major"=>"8762", "minor"=>"322", "description"=>"Engineering", "amount"=>"200000", "active"=>"1"}, {"major"=>"8762", "minor"=>"445", "description"=>"Tanks", "amount"=>"2100000", "active"=>"1"}, {"major"=>"8762", "minor"=>"500", "description"=>"Pipe, Valves & Fittings", "amount"=>"150000", "active"=>"1"}]
 => [{"major"=>"8762", "minor"=>"322", "description"=>"Engineering", "amount"=>"200000", "active"=>"1"}, {"major"=>"8762", "minor"=>"445", "description"=>"Tanks", "amount"=>"2100000", "active"=>"1"}, {"major"=>"8762", "minor"=>"500", "description"=>"Pipe, Valves & Fittings", "amount"=>"150000", "active"=>"1"}] 
2.0.0p247 :036 > line_items_attributes.inject(0) {|sum, hash| sum += hash["amount"].to_i; sum}
 => 2450000 

D'oh!再次查看后,我发现存储的数据实际上是:

{"line_items_attributes"=>[{"major"=>"8762", "minor"=>"322", "description"=>"Engineering", "amount"=>"200000", "active"=>"1"}, {"major"=>"8762", "minor"=>"445", "description"=>"Tanks", "amount"=>"2100000", "active"=>"1"}, {"major"=>"8762", "minor"=>"500", "description"=>"Pipe, Valves & Fittings", "amount"=>"150000", "active"=>"1"}]}

所以现在我运行这个:

Model.find(1).data["line_items_attributes"].inject(0) {|sum, hash| sum + hash["amount"].to_i}

一切都很好。我可能不需要以这种方式存储它,但我只是以原型教程为例。

感谢那些花时间看这篇文章的人。我自己想出来的。。。有点。

最新更新