以前、Qiitaのこの記事(Railsでお手軽ランキング機能)を参考にして、ランキング機能を実装したことがありました。
無事、実装できたのですが、以下の問題に直面しました。
kaminariのページネーション機能と組み合わせると上手くいかない!
@posts = Post.find(Like.group(:post_id).order('count(post_id) desc').pluck(:post_id)).page(params[:page])
kaminariのpageメソッドと組み合わせると上記のようになりますが、これだと以下のようなエラーが発生します。
そのためpageメソッドと組み合わせても、問題ないランキング機能をご紹介いたします。
前提
- 記事のテーブル名は posts
- いいねのテーブル名は likes
- すでにいいね機能を実装しており、postsとlikesのアソシエーションができていること
ランキング機能の実装
@posts = Post.joins(:likes).group(:post_id).order('count(post_id) desc')
これでOKです!
一つずつ説明します。
Post.joins(:likes) #postsテーブルとlikesテーブルを内部結合します
group(:post_id) #post_idが同じものにグループを分けます
order('count(post_id) desc') #それをpost_idの多い順番に並び替える
これでランキング機能は完成です。
以下のように、コードの末尾にpageメソッドをつけてもエラーにならず、ページネーション機能が機能していると思います。
@posts = Post.joins(:likes).group(:post_id).order('count(post_id) desc').page(params[:page])
参考文献
- Railsでお手軽ランキング機能
https://qiita.com/mitsumitsu1128/items/18fa5e49a27e727f00b4