按计数分组十年

时间:2016-11-13 22:58:53

标签: ruby-on-rails ruby postgresql

我有一张Album个表格,其date列名为release_date

我希望得到所有这几十年的清单以及该十年发布的专辑数量。

因此,输出可能类似于:

  • 2010 - 11
  • 2000 - 4
  • 1990 - 19
  • 1940 - 2

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

这实际上是我之前的一个问题:Group by month+year with counts

这可能对解决方案有所帮助......我不确定如何按十年进行分组。

3 个答案:

答案 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)

您的问题有多种可能的解决方案,但我会尝试:

  1. Album表添加一个新列,名为decade。您可以为此海豚使用迁移。
  2. 创建一个回调(类似于触发器,但在程序员方面),在将decade保存到数据库之前设置Album值。
  3. 最后,您可以使用此useful queryAlbum分组十年。在你的情况下,Album.group(:decade).count会给你一个十进制数Album的哈希值。
  4. ...
  5. 利润?
  6. 除了笑话,回调应该是这样的:

    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 }
    

    我没有测试答案,所以试一试告诉我它是怎么回事。