🍎
【Rails】いいねが多い順に並び替え
はじめに
- いいね機能非同期通信で実装済
- ユーザーテーブル:users, 投稿テーブル:books, いいね中間テーブル:favorites
- 完成イメージ ↓
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」をつけることで降順から昇順に変更され、多い順で表示されるようになっている
以下の記事を参考にさせていただきました🙏
Discussion