我有一个Albums
表,其中有一个名为date
的release_date
列。
我想获得当前所有月份+年份组合的列表,以及该月份/年份发行的专辑数量。
因此,输出结果可能类似于:
在Postgres 9.6,FWIW上有Rails 5的Ruby 2.3.1,带Rails 5。
我假设您的表按照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
方法是一种标准计数算法,它为每个唯一数组项返回一个带有计数的哈希值。
数据库层是此任务所属的地方,而不是Ruby:
Album.group("TO_CHAR(release_date, 'Month YYYY')").count
为什么使用数据库层?仅仅因为它比几乎其他任何东西都闪电般快,并且与Ruby相比,它在资源效率方面[特别是],它具有完美的伸缩性,并且由于拥有大量的Album
记录,您可以简单地使内存过载,而实际上从未完成处理。