我有一张Album
个表格,其date
列名为release_date
。
我希望得到所有这几十年的清单以及该十年发布的专辑数量。
因此,输出可能类似于:
Ruby 2.3.1 w / Rails 5 on Postgres 9.6,FWIW。
这实际上是我之前的一个问题:Group by month+year with counts
这可能对解决方案有所帮助......我不确定如何按十年进行分组。
答案 0 :(得分:3)
使用Ruby处理数据库数据在各方面都是低效的。
我建议在数据库级别上执行此操作:
Album.group("(DATE_PART('year', release_date)::int / 10) * 10").count
这里发生的事情,基本上你需要花费一年时间release_date
,将其转换为整数,花费十年时间来计算这个群体的专辑。
说,我们有release_date
"2016-11-13T08:30:03+02:00"
:
2016 / 10 * 10
#=> 2010
答案 1 :(得分:-1)
是的,这与您之前的问题非常相似。在这种情况下,您需要一种从专辑年份返回十年基准年的方法,而不是创建月/年组合并使用组合作为分组标准。
由于您正在开发模式,请考虑编写代码以便可以重用它。
def album_decades
Album.all.map { |album| album.release_date.year / 10 * 10 }
end
def count_each(array)
array.each_with_object(Hash.new(0)) { |element, counts| counts[element] += 1 }
end
现在,您可以调用count_each(album_decades)
获取所需的结果。看看您是否可以通过调用album_months_and_years
编写一个方法count_each(album_months_and_years)
,该方法将从您之前的问题中产生您想要的结果。
答案 2 :(得分:-1)
您的问题有多种可能的解决方案,但我会尝试:
Album
表添加一个新列,名为decade
。您可以为此海豚使用迁移。decade
保存到数据库之前设置Album
值。Album
分组十年。在你的情况下,Album.group(:decade).count
会给你一个十进制数Album
的哈希值。class Album < ActiveRecord::Base
# some code ...
before_save :set_decade # this is the 'callback'
# ...
private
def set_decade
self.decade = self.release_date.year / 10
end
然后,如果您使用第3步,它将返回类似于:
的内容# => { '195' => 7, '200' => 12 }
我没有测试答案,所以试一试告诉我它是怎么回事。