如何在Rails中对列和日期列进行求和

时间:2015-07-23 10:06:16

标签: ruby-on-rails activerecord named-scope

我有一个包含以下列的模型

费用模型

Date
fee
discount

数据

1/1/15, 1, 1
1/1/15, 2, 1
2/2/15, 3, 3

我有一些像this_year这样的命名范围

我想做一些像Charges.this_year.summed_up

这样的事情

如何为此创建命名范围。

然后返回的响应应为:

1/1/15, 3, 2
2/2/15, 3, 3

2 个答案:

答案 0 :(得分:0)

假设您的模型具有日期字段(例如published_at)和2个整数字段(例如费用,折扣)。您可以使用“group”方法在published_at上运行GROUP BY。如果您只想要一个字段的总和,那么只需使用sum方法。如果需要多个字段,则必须在其中运行带有SQL SUMs的select,以获得多个列总和。这是一个例子。

Charge..group(published_at)
.select("published_at, SUM(fee) AS sum_fee, SUM(discount) AS sum_discount")
.order("published_at")

注意:汇总字段不会显示在rails控制台返回值提示中。但它们可供您使用。

答案 1 :(得分:0)

根据您想要的最终结果,您可能需要查看.group(:attribute)而不是.group_by

Charge.group(:date).each do |charge|
     charge.where('date = ?', charge.date).sum(:fee)
     charge.where('date = ?', charge.date).sum(:discount)
end

我发现这种方法更容易,特别是如果要为要从表中提取的数据设置多个条件。

无论如何,我有一个会计模型,提出了这种问题,我需要在一张桌子上使用信用卡和借记卡以及付款信息类型,并花了几个小时学习所有关于group_by的问题,然后才意识到这一点.group()提供了一个简单的解决方案。