Rails 4:按月分组

Geo*_*ath 5 ruby ruby-on-rails

在Rails / Ruby中,如何基于表中的日期列对月份进行分组和汇总度量。

我已经尝试过Railscasts的以下技术。

http://railscasts.com/episodes/29-group-by-month

到目前为止,我的代码看起来像这样

result = result.where(transaction_date: start..Date.current)
result = result.select(:transaction_date, :quantity)
result.group_by { |t| t.transaction_date.beginning_of_month }
Run Code Online (Sandbox Code Playgroud)

我想,我需要与SQL GROUP BY相当的Ruby来汇总数量。

我正在寻找的SQLite3版本是:

select strftime('%m', transaction_date)
     , sum(quantity)
from transactions
group by strftime('%m', transaction_date)
Run Code Online (Sandbox Code Playgroud)

Pet*_*ein 5

因此,这是一个很好的示例,说明了为什么您应该在dev和prod中使用相同的数据库,因为您确实想在SQL中执行此操作,这对于您指定的两个数据库而言会有所不同。我给你Postgres版本。

假设您的模型称为“实体”,并且要对一个称为“数量”的属性求和,那么您将需要执行以下操作:

Entity
  .select("DATE_TRUNC('month', created_at) AS month, SUM(quantity) AS total_quantity")
  .group('month')
Run Code Online (Sandbox Code Playgroud)

生成的Entity对象将具有虚拟属性“ month”和“ total_quantity”,您可以将其用于报告。

  • 想通了这一点。`.count`不起作用,但是`.select(“ COUNT(*)AS AS count,date_trunc(...`)将在返回数组中的每个分组值上添加一个虚拟属性`count`。这甚至会保留Arel .select [...]。group之前和之后的构造。 (2认同)