Shpigford Shpigford - 19 days ago 5
Ruby Question

Group by month+year with counts

I have a table of

Albums
that has a
date
column named
release_date
.

I want to get a list of all the month + year combinations present along with the number of albums released in that month/year.

So, the output might be something like:


  • November 2016 - 11

  • October 2016 - 4

  • July 2016 - 19

  • December 2015 - 2



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

Answer

I'm assuming your table is singular Album per Rails convention. If not, consider changing it.

 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 }

Explanation:

The .map method iterates over the albums and returns an array of strings consisting of ["month year", "month year", ... ].

The .each_with_object method is a standard counting algorithm that returns a hash with a count for each unique array item.

Comments