2016-11-10 13 views
2

私はAlbumsのテーブルを持っていて、release_dateという名前のdateカラムを持っています。月単位+年単位の集計

その月/年にリリースされたアルバムの数とともに、現在のすべての月+年の組み合わせのリストを取得したいと考えています。 4

  • 2016年7月 - - 11
  • 2016年10月 - 19
  • 2015年12月 - 2
    • 2016年11月:

      ので、出力は次のようになるかもしれませんRuby 2.3.1、Rails 5、Postgres 9.6、FWIW。

    +1

    それはSQL使用して非常に簡単です:1でアルバムグループから(*)カウント、 '選択to_char関数(RELEASE_DATE、「月YYYYを」);' – Abelisto

    +0

    受け入れ理由を、効率的に何が必要達成するための方法や説明のための私の答えを参照してください答えはこれのために悪い道具を使います –

    答えて

    1

    私はあなたのテーブルが単線であると仮定しています。Album Railsの規約に従います。そうでない場合は、変更を検討してください。

    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メソッドは、ユニークな配列アイテムごとにカウントを持つハッシュを返す標準カウントアルゴリズムです。

    3

    データベース層は、このタスクが属するところである、ないルビー:

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

    データベース層を使用したのはなぜ?単に他のものに比べて雷が速いので、資源効率が良い特にとRubyに比べると、それは完全に縮尺されており、Albumトンの記録があるため、単純にメモリをオーバーロードして処理を完了することはできません。