ruby 在 rails 上对 group_by 之后的字段求和
ruby on rails sum fields after group_by
在我开始之前,我只想告诉你,我尝试了一些类似主题的方法,但它们对我的情况并不适用。
我有按天分组的订单(使用 group_by(&:created_at) 方法)。现在我想对特定日期的订单中的 "total" 字段求和。它应该看起来像这样:
2015 年 5 月 21 日
总计:215(订单 1 总计 = 200,订单 2 总计 = 15)
2015 年 5 月 22 日
总计:0
2015 年 5 月 23 日
总计:321
我试过这样的东西
orders.to_a.map { |h| h[:total] }.sum
orders.to_a.inject { |sum, h| sum += h[:total] }
但它只打印每个订单的总计(不是每日总和)。
我正在像这样从数据库 (postgres) 中获取数据:
@orders = current_user.orders.where(created_at: Time.now.beginning_of_month.. Time.now).group_by(&:created_at)
结果我得到了这样的结果:
{Sat, 06 Jun 2015 13:06:08 CEST +02:00=>
[#<Order id: 19, total:10],
[#<Order id: 20, total:12],
Fri, 05 Jun 2015 15:42:24 CEST +02:00=>
[#<Order id: 19, total:10],
[#<Order id: 20, total:12]}
@pauloancheta
使用您的解决方案并获得这样的视图 (HAML)
#subtotal
- @orders.each do |day,orders|
.col-md-4
%h2
= day.strftime("%Y %m %d")
= link_to '', monthly_summary_path(date: day), class: "btn btn-info btn-small glyphicon glyphicon-zoom-in"
%p= "sum: #{orders.map(&:total).sum}"
当我一天有两个订单时,我得到两个单独的列而不是 1 个总和。
我用我的控制台试过了,它成功了。希望它也对你有用。 orders.map(&:total).sum
Order.where
已经 returns 一个数组,所以我认为不需要 .to_a
方法。
首先,created_at
是时间戳而不是日期,因此您根本没有按日期分组,而是按日期 和 的时间分组日。这就是为什么您会在某些日期获得多个结果的原因。
其次,您可以通过对日期使用 GROUP BY 然后对每个组内的 total
求和来让数据库完成所有工作:
current_user.orders
.where(created_at: Time.now.beginning_of_month .. Time.now)
.group('created_at::date')
.sum(:total)
这会给你一个像这样的哈希:
{ date_object => sum_for_that_date, ... }
在我开始之前,我只想告诉你,我尝试了一些类似主题的方法,但它们对我的情况并不适用。
我有按天分组的订单(使用 group_by(&:created_at) 方法)。现在我想对特定日期的订单中的 "total" 字段求和。它应该看起来像这样: 2015 年 5 月 21 日 总计:215(订单 1 总计 = 200,订单 2 总计 = 15) 2015 年 5 月 22 日 总计:0 2015 年 5 月 23 日 总计:321
我试过这样的东西
orders.to_a.map { |h| h[:total] }.sum
orders.to_a.inject { |sum, h| sum += h[:total] }
但它只打印每个订单的总计(不是每日总和)。
我正在像这样从数据库 (postgres) 中获取数据:
@orders = current_user.orders.where(created_at: Time.now.beginning_of_month.. Time.now).group_by(&:created_at)
结果我得到了这样的结果:
{Sat, 06 Jun 2015 13:06:08 CEST +02:00=>
[#<Order id: 19, total:10],
[#<Order id: 20, total:12],
Fri, 05 Jun 2015 15:42:24 CEST +02:00=>
[#<Order id: 19, total:10],
[#<Order id: 20, total:12]}
@pauloancheta 使用您的解决方案并获得这样的视图 (HAML)
#subtotal
- @orders.each do |day,orders|
.col-md-4
%h2
= day.strftime("%Y %m %d")
= link_to '', monthly_summary_path(date: day), class: "btn btn-info btn-small glyphicon glyphicon-zoom-in"
%p= "sum: #{orders.map(&:total).sum}"
当我一天有两个订单时,我得到两个单独的列而不是 1 个总和。
我用我的控制台试过了,它成功了。希望它也对你有用。 orders.map(&:total).sum
Order.where
已经 returns 一个数组,所以我认为不需要 .to_a
方法。
首先,created_at
是时间戳而不是日期,因此您根本没有按日期分组,而是按日期 和 的时间分组日。这就是为什么您会在某些日期获得多个结果的原因。
其次,您可以通过对日期使用 GROUP BY 然后对每个组内的 total
求和来让数据库完成所有工作:
current_user.orders
.where(created_at: Time.now.beginning_of_month .. Time.now)
.group('created_at::date')
.sum(:total)
这会给你一个像这样的哈希:
{ date_object => sum_for_that_date, ... }