🍎

【Rails】いいねが多い順に並び替え

2023/08/10に公開

はじめに

  • いいね機能非同期通信で実装済
  • ユーザーテーブル:users, 投稿テーブル:books, いいね中間テーブル:favorites
  • 完成イメージ ↓
    altテキスト

1.アソシエーションを設定

app/models/user.rb
class User < ApplicationRecord
:
  has_many :books, dependent: :destroy
  has_many :favorites, dependent: :destroy
:
app/models/book.rb
class Book < ApplicationRecord
:
  belongs_to :user
  has_many :favorites, dependent: :destroy
  has_many :favorited_users, through: :favorites, source: :user
:
app/models/favorite.rb
class Favorite < ApplicationRecord
  belongs_to :user
  belongs_to :book
end
  • Userモデル、Bookモデル、中間テーブルとしてFavoriteモデルを繋げる
  • Bookモデルに記述した「 has_many :favorited_users, through: :favorites, source: :user」
      は、Favoriteモデルを介してUserモデルのデータを取得するという記述

2.booksコントローラー編集

app/controllers/books_controller.rb
class BooksController < ApplicationController
:
:
  def index
    to = Time.current.at_end_of_day
    from = (to - 6.day).at_beginning_of_day
    @books = Book.includes(:favorited_users).
      sort_by {|x|
        x.favorited_users.includes(:favorites).where(created_at: from...to).size
      }.reverse
    @book = Book.new
  end
:
end

記述内容について ↓

app/controllers/books_controller.rb
to = Time.current.at_end_of_day
from = (to - 6.day).at_beginning_of_day

「一週間分のデータを取得する」
Time.current・・・config/application.rbに設定してあるタイムゾーンを元に日時を取得
at_end_of_day・・・1日の終わりを23:59に設定
from = (to - 6.day)・・・1週間
at_beginning_of_day・・・1日の始まりを0:00に設定

app/controllers/books_controller.rb
@books = Book.includes(:favorited_users).

元々は「@books = Book.all」で投稿されたすべてのデータを取得していたが、
上記の記述に変更することで
Bookモデルに記述した「:favorited_users」からデータを取得するようになる

app/controllers/books_controller.rb
sort_by {|x|
  x.favorited_users.includes(:favorites).where(created_at: from...to).size
}.reverse

「sort_byメソッド」を使用していいねを少ない順に取り出す
最後に「reverse」をつけることで降順から昇順に変更され、多い順で表示されるようになっている


以下の記事を参考にさせていただきました🙏
https://qiita.com/ooyama-tetu/items/1e19fea32908a6a737f5

https://zenn.dev/ganmo3/articles/cfd129246f47c4

Discussion