【问题标题】:Report using Rails ActiveRecord group by使用 Rails ActiveRecord 组报告
【发布时间】:2013-10-02 01:12:06
【问题描述】:

我正在尝试生成一份报告以显示会计交易历史记录。在大多数情况下,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

【问题讨论】:

  • 我相信你可以使用 AREL,就像这篇文章中描述的那样:stackoverflow.com/questions/5972336/…
  • 这看起来可能有效。我以前没有使用过 AREL,所以我必须深入研究一下。我尝试了海报在您链接到的帖子中的建议,但是当我在控制台中对其进行测试时,它不会为变量分配任何内容。我一定是错过了什么。

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


【解决方案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
  • 编辑 *

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

@history[0].credit_sum

【讨论】:

  • 太棒了,差不多了!我必须进行一些更改才能使其正常工作。我将:customer_id 更改为:reference_id,因为GROUP BY 元素必须在选择列表中,并且还将:created_at 添加到选择列表中,因为正如您所提到的,ORDER BY 元素也必须在选择列表中。然后在第一个多属性选择列表中缺少括号——它需要是select([:reference_id, :transaction_type_id, :created_at])。除了这些变化之外,它工作得很好。赞赏!
  • 这就是我喜欢 stackoverflow.com 的原因!伟大的工作 Magness。最后一件事。当我在 Rails 3.2 中循环访问 @history.each do |h| 时,我只需使用 h.credit_sum 就可以访问 credit_sum。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多