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