#はじめに
補助金に関する記事の閲覧・検索ができるアプリケーションの作成をしています。今回いいね機能が実装できたため、いいねの数が多い順番に記事を並べる、ランキング機能を実装しました。備忘録及び復讐のため記述します。
#環境
Ruby on Rails '6.0.0'
Ruby '2.6.5'
#前提
・ユーザー管理機能実装済み(Userテーブル)
・記事の投稿・閲覧機能実装済み(Articleテーブル)
・いいね機能実装済み(Likeテーブル)
#実装方法
複数の記事の中からいいね数が多い順番に取得することができれば良いため、Articleテーブルからの記事の取得方法を記述します。
#コントローラーの編集
先に実装方法を記述し、中身について解説していきます。
def index
@ranks = Article.find(Like.group(:article_id).order('count(article_id) DESC').limit(4).pluck(:article_id))
end
#####Article.find(~)
- findメソッドを使用して()の中で指定する記事を探して取得します。
#####Like.group(:article_id)
- Likeテーブルの中にある、article_idが重複するレコードをまとめて並べ替えています。
#####order('count(article_id) DESC')
- count(article_id)したデータをDESC(降順)で並べ替えています。
#####count(article_id)
- article_idが同じものを数えるメソッドです。Likeテーブルに保存されているレコードを数えることで、いいねの数を取得しています。
#####limit(4)
- 上から4つ取得するメソッドです。今回は4位まで表示させたいと思ったので、この表現にしました。
#####pluck(:article_id)
- 引数としてカラム名のリストを与えると、指定したカラムの値の配列を、対応するデータ型で返します。
#おわりに
こちらの記事を参考にさせていただきました!!!ありがとうございました。
#2020/12/23追記
いいねの数が多い順に記事を表示する実装はできましたが、記事ごとに「第1位」などの表示ができたらと思い、追加実装しました。
<% @ranks.each.with_index(1) do |article, i| %>
<div class="card-group col-md-6 col-lg-3">
<span class="article-info"><i class="fas fa-crown"></i> 第<%= i %>位</span>
順位を表示するには、「.with_index(1)」を使用すること順位を表示できました。
参考URLです!