在group_by之后的ruby on rails sum字段

时间:2015-06-06 16:55:27

标签: ruby-on-rails ruby postgresql rails-activerecord

在我开始之前,我只是想告诉我,我尝试过类似主题的一些方法,但它们与我的情况不协调。

我有订单,我按天分组(使用group_by(&:created_at)方法)。现在我想从特定日期的订单中总结“总计”字段。看起来应该是这样的: 2015年5月21日 总计:215(order1总计= 200,order2总计= 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}"

当我在一天内有两个订单时,我会得到两个单独的列,而不是一个总和。

2 个答案:

答案 0 :(得分:2)

首先,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, ... }

答案 1 :(得分:0)

我用我的控制台尝试了这个并且它有效。希望它对你也有用。 orders.map(&:total).sum

Order.where已经返回一个数组,因此我认为不需要.to_a方法。