LoginSignup
1

posted at

updated at

Rails お気に入りランキング実装

この記事は学習中に実装した内容をアウトプットし、更に理解を深めるための記録用投稿になります。
投稿している内容と同じ箇所で躓いている方に少しでもお力添えできれば幸いです。

実装した内容

今回はユーザーが投稿した内容に複数のユーザーがお気に入り(いいね)をし、そのいいね数の多い順番にランキング形式で表示する内容になります。

前提条件

・投稿した記事のテーブル名はdishesとします。
・いいね機能のテーブル名はfavoritsとします。
・いいね機能を実装済み

モデル

コントローラで使用するためのメソッドをモデルに記述します。
コントローラの記述を長くしないようにするためのようです。モデルの使い方を再確認!

*/app/models/dish.rb

def self.create_all_ranks
  Dish.find(Favorit.group(:dish_id).where(created_at: Time.current.all_week).order('count(dish_id) desc').limit(10).pluck(:dish_id))
end

[self.create_all_ranks]
self・・・クラスメソッド。modelクラス(今回ならばDishモデル)のレコードを検索するなどの用途や作成されているメソッド。

[Favorit.group(:dish_id)]
Favorit(いいね)がついているdish_idを呼び出す。

[where(created_at: Time.current.all_week)]
この記述で直近一週間の投稿を選びます。
rails cでTime.currentと入力すると現在の時間が表示されます。そこにall_weekと付け加えることで直近位週間を表示できます。これはとても勉強になりました!

2.6.3 :001 > Time.current
 => Sun, 17 Apr 2022 03:14:39 UTC +00:00 

[order('count(dish_id) desc')]
orderメソッドでいいねがついているdish_idをいいねの多い順に並び替えます。

[limit(10)]
上位10までを指定。

[pluck(:dish_id)]
dish_idを数字で表すための記述

コントローラ

先ほどのモデルでの記述を呼び出します。

def ranking
  @all_ranks = Dish.create_all_ranks
end

ビュー

<h3>お気に入りランキング</h3>
<% @all_ranks.each.with_index(1) do |dish,i| %><%= i %><%= dish.dish_name %>
投稿者
<%= dish.user.name %>
❤いいね数️<%= dish.favorits.count %>
<% end %>

[with_index(1)]
このように記述することで上位1から表示することができます。2位以降から表示したい時は[with_index(2)]と」記述します。

振り返り

今まで見たことのないメソッドがかなり多く出てきました。
これだけ使いこなせるようになるには時間がかかりそう、、、
でも一個一個調べてrails cで試していけば理解が深まりそうな気がする!

・self:modelクラス(今回ならばDishモデル)のレコードを検索するなどの用途や作成されているメソッド。

・group:指定したカラムのレコードの種類ごとにデータをまとめるメソッド。
参考記事
https://pikawaka.com/rails/group

・order:id順にデータを取得できる。
参考記事
https://pikawaka.com/rails/order

・limit:所得件数の上限を指定
・pluck:指定したカラムを数字で表すためのメソッド。


以上になります。

説明の不足している点などあるかもしれないのでご指摘いただけると幸いです。
よろしくお願いします。

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
What you can do with signing up
1