LoginSignup
3
2

More than 3 years have passed since last update.

Railsでランキング機能を実装する方法

Posted at

以前、Qiitaのこの記事(Railsでお手軽ランキング機能)を参考にして、ランキング機能を実装したことがありました。
無事、実装できたのですが、以下の問題に直面しました。

kaminariのページネーション機能と組み合わせると上手くいかない!

@posts = Post.find(Like.group(:post_id).order('count(post_id) desc').pluck(:post_id)).page(params[:page])

kaminariのpageメソッドと組み合わせると上記のようになりますが、これだと以下のようなエラーが発生します。
スクリーンショット 2020-08-04 16.58.47.png

そのため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])

参考文献

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2