报告使用Rails ActiveRecord group by

时间:2013-10-02 01:12:07

标签: ruby-on-rails ruby-on-rails-3

我正在尝试生成一个到会计交易历史屏幕的报告。在大多数情况下,AccountingTransaction表中每个记录只有一个显示行。但偶尔会有一些交易我希望作为一个交易显示给最终用户,这些交易实际上是幕后两个会计交易。这是由于该应用程序是一个基金会计应用程序,导致收入和基金分割延期。

如果我逐个显示所有行,那么这些双重条目对于用户来说看起来很奇怪,因为资金分割和延期是“幕后”。所以我想将所有相关的交易汇总到屏幕上的一个显示行中。

我的查询现在使用group by对相关交易进行分组

@history = AccountingTransaction.where("customer_id in (?) AND no_download <> 1", customers_in_account).group(:transaction_type_id, :reference_id).order(:created_at)

当我循环播放时,我按照自己的意愿对事务进行分组,但我正在努力解决如何显示组中所有记录的“信用”字段的总和。 (它只显示该组第一条记录的功劳)如果我在查询中添加.sum(:credit),当然,它会按照我的要求返回总和,但不会返回所有其他数据。

我有没有办法像我的@history查询一样对这些记录进行分组,还可以获得每个群组的信用字段总和?

*添加 * 我真正想要的是以下SQL查询将给我的东西。

    SELECT transaction_type_id, reference_id, sum(credit) 
WHERE customer_id in (21,22,23,24) AND no_download <> 1 
GROUP BY reference_id, transaction_type_id ORDER BY created_at

1 个答案:

答案 0 :(得分:1)

我不确定你可以做“ORDER BY created_at”并且不在选择字段中包含它,但这是一个例子。

@history = AccountingTransaction.
  select([:reference_id, :transaction_type_id, :created_at]).
  select(AccountingTransaction.arel_table[:credit].sum.as("credit_sum")).
  where("customer_id in (?) AND no_download <> 1", customers_in_account).
  group(:transaction_type_id, :reference_id).
  order(:created_at)

要访问credit_sum,您可以这样做:

@history[0].attributes["credit_sum"]

我想如果您愿意,可以创建一个方法:

def credit_sum
  attributes["credit_sum"]
end
  • 编辑*

如评论中所述,您可以直接访问该属性:

@history[0].credit_sum