2016-11-13 10 views
2

私はというdate列を持つAlbumのテーブルを持っています。10進数でグループ化

この10年間でリリースされたアルバムの数と一緒に、何十年ものリストを取得したいと思います。

ので、出力のようなものかもしれません:

  • 2010から11
  • 2000から4
  • 1990年から1919年
  • 1940から2

ルビー2.3.1 Postgres 9.6、FWIWのRails 5を使用しています。

これは、基本的に私が持っていた前のものとフォロー質問です:溶液で役立つかもしれGroup by month+year with counts

...私はちょうど十年でグループ化を行うするかどうかはわかりません。

+0

私は疑問に思ってhttp://stackoverflow.com/質問/ 40538996/group-by-monthyear-with-counts/40583253#40583253) –

答えて

2

DBデータを処理するために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

はい、以前の質問によく似ています。この場合、月/年の組み合わせを作成する代わりに、その組み合わせをグループ化基準として使用する代わりに、アルバム年から10年の基準年を返すメソッドが必要です。

パターンが作成されているので、再利用できるようにコードを記述することを検討してください。

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)に電話できます。 count_each(album_months_and_years)を呼び出して、以前の質問から得たい結果を生成するメソッドalbum_months_and_yearsを書くことができるかどうかを確認してください。

-1

あり、あなたの問題に複数の可能な解決策がありますが、私がしようとするだろう:

  1. decadeと呼ばれ、Albumテーブルに新しい列を追加します。このポルポイズのために移行を使用することができます。
  2. AlbumをDBに保存する前に、decadeの値を設定したコールバックを作成します(これはトリガーのようですが、プログラマ側で行います)。
  3. 最後に、このuseful queryを使用してAlbumを10年単位でグループ化することができます。あなたのケースではAlbum.group(:decade).countとなります。これは、十年単位でAlbumの数字を持つハッシュを与えます。
  4. ...
  5. Profit?

ジョークはさておき、コールバックのようなものでなければなりません:私はテストしていない

# => { '195' => 7, '200' => 12 } 

:次に

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を使用している場合、それは次のように返します答えを試してみて、それがどうなったか教えてください。

+0

データベースに冗長なデータを残さないようにします。 – moveson

+0

実際には、何をしているのか分かっていれば、実際には冗長なデータを気にしません。時には、より明確な解決策を作り、そして/または定期的なSQLクエリをとる時間を節約するために、 "ルール"を避けることがあります。私は専門家(古いシステムデザイナー/アナリスト、私の先生)の経験から教えてくれます。 –