Rails/ActiveRecord 按月+年分组

Rails/ActiveRecord Group by month+year with counts

我有一个 Albums 的 table,它有一个名为 release_datedate 列。

我想获得所有月份 + 年份组合的列表以及其中发行的专辑数量 month/year。

因此,输出可能类似于:

Ruby 2.3.1 w/ Rails 5 on Postgres 9.6, FWIW.

我假设您的 table 根据 Rails 惯例是单数 Album。如果不是,请考虑更改它。

 Album.all.map { |album| [Date::MONTHNAMES[album.date.month], album.date.year].join(' ') }
  .each_with_object(Hash.new(0)) { |month_year, counts| counts[month_year] += 1 }

解释:

.map 方法迭代专辑和 returns 由 ["month year", "month year", ... ] 组成的字符串数组。

.each_with_object 方法是一种标准计数算法,returns 一个散列,每个唯一数组项都有一个计数。

数据库层是这个任务所属的地方,不是Ruby:

Album.group("TO_CHAR(release_date, 'Month YYYY')").count

为什么要使用数据库层?仅仅因为它比几乎任何其他东西都快如闪电,它是资源高效的 尤其是 与 Ruby 相比,它可以完美地扩展并且因为拥有大量的 Album 记录您可以简单地使内存过载而永远不会真正完成处理。