将group_by数组中的对象添加到一起

时间:2015-04-18 22:35:14

标签: ruby-on-rails arrays sum

我有一系列交易,每个都看起来像......

Transaction:0xc3b8de4 @id="p5qvzdyQZeTyKk97ozbAhAeN0DwVgMh6re13Z", @account="N08xNQywYVUZaqoN9bwAI6BbeBrzyAfKmpzQe", @date="2014-02-03", @amount=100, @name="COMED 4131 Reference#", @meta={"is_risky"=>false, "location"=>{"store_number"=>"10818"}}, @location=nil, @pending=false, @score={"location"=>{}, "name"=>0.2}, @type={"primary"=>"unresolved"}, @category=nil, @category_id=nil>]} 

我想按月对交易进行分组,所以我有这个......

@income_by_month = @payroll_transactions.group_by { |t| t.date.to_date.month })

按月对交易进行分组。

现在我需要每月交易中“金额”对象的总和。所以我需要每个月的总金额。这是我到目前为止,但我没有成功。

@payroll_transactions = @user.transactions.find_all { |t| t.category_id == '21009000' } #finds all payroll transactions for all months
@income_by_month = @payroll_transactions.group_by { |t| t.date.to_date.month }) #groups transactions into month groups
@income_by_month.map(&:amount).inject(0, &:+) #I need a method to sum the total of amounts for each month

提前致谢

2 个答案:

答案 0 :(得分:1)

这应该做:

@income_by_month = @payroll_transactions.group_by { |t| t.date.to_date.month }).map do |month, transactions|
  [month, transactions.sum(&:amount)]
end.to_h

答案 1 :(得分:0)

这个怎么样? compact删除nil值,不知道您是否需要。

@income_by_month.map(&:amount).compact.reduce(&:+)

如果我理解正确,您可能需要@income_by_month.month(:april).map...,而您可能仍需要实施该功能。