Rails/ActiveRecord 按月+年分组
Rails/ActiveRecord Group by month+year with counts
我有一个 Albums
的 table,它有一个名为 release_date
的 date
列。
我想获得所有月份 + 年份组合的列表以及其中发行的专辑数量 month/year。
因此,输出可能类似于:
- 2016 年 11 月 - 11 日
- 2016 年 10 月 - 4
- 2016 年 7 月 - 19 日
- 2015 年 12 月 - 2
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
记录您可以简单地使内存过载而永远不会真正完成处理。
我有一个 Albums
的 table,它有一个名为 release_date
的 date
列。
我想获得所有月份 + 年份组合的列表以及其中发行的专辑数量 month/year。
因此,输出可能类似于:
- 2016 年 11 月 - 11 日
- 2016 年 10 月 - 4
- 2016 年 7 月 - 19 日
- 2015 年 12 月 - 2
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
记录您可以简单地使内存过载而永远不会真正完成处理。