あざらし備忘録。

音ゲー好きなウェッブエンジニアがいろいろ思った事やった事を書いていくブログです

ActiveRecordであるフィールドの値を値別に集計してランキングを作る

自分なりの解決策を。

もっとスマートな方法がある気がするのだけどわからない(´・ω・`)

やりたいこと

例えば、記事に対するお気に入りを管理するfavoritesテーブルがあったとして、

id article_id
1 1
2 1
3 2
4 3
5 1
6 2

のように値が格納されていて、これをarticle_id別に集計して、降順に並べたいような時、ActiveRecordでどのように表現すれば良いのか分かりませんでした。

つまり、求める結果としては、

article_id favorite_total
1 3
2 2
3 1

のような感じです。

解決方法

結果としてはこんな感じにして取りました。

Favorite.group(:article_id).size.sort {|a, b| (-1) * (a <=> b) }.slice!(0..9)

こうすると[[1,3],[2,2],[3,1]]のような配列の形で取れます。第一要素がarticle_id,第二要素がfavorite_totalです。

うーん。とれたけどあんまり納得はできてない感じ。 誰かもっと良いの知ってるよ、というお方いらっしゃったら教えていただけると喜びますorz