Rails / ActiveRecord按月份和年份分组并计数

问题描述 投票:5回答:2

我有一个Albums表,其中有一个名为daterelease_date列。

我想获得当前所有月份+年份组合的列表,以及该月份/年份发行的专辑数量。

因此,输出结果可能类似于:

  • 2016年11月-11
  • 2016年10月4日
  • [2016年7月-19日
  • 2015年12月-2

在Postgres 9.6,FWIW上有Rails 5的Ruby 2.3.1,带Rails 5。

ruby-on-rails ruby postgresql activerecord ruby-on-rails-5
2个回答
1
投票

我假设您的表按照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方法遍历相册并返回由["month year", "month year", ... ]组成的字符串数组。

[.each_with_object方法是一种标准计数算法,它为每个唯一数组项返回一个带有计数的哈希值。


6
投票

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

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

为什么使用数据库层?仅仅因为它比几乎其他任何东西都闪电般快,并且与Ruby相比,它在资源效率方面[特别是],它具有完美的伸缩性,并且由于拥有大量的Album记录,您可以简单地使内存过载,而实际上从未完成处理。

© www.soinside.com 2019 - 2024. All rights reserved.