💞

【Rails】 投稿を過去一週間でいいねの多い順に表示させる

2023/06/07に公開

【Rails】 sort_by での並び替え

アソシエーション

user.rb
has_many :books, dependent: :destroy
has_many :favorites, dependent: :destroy
book.rb
belongs_to :user
has_many :favorites, dependent: :destroy
favorite.rb
belongs_to :user
belongs_to :book

コントローラー

いいね数が多い順で表示させるため、条件を定義する。

book_controller.rb
def index
    to  = Time.current.at_end_of_day
    from  = (to - 6.day).at_beginning_of_day
    @books = Book.includes(:favorites).sort_by {|x| x.favorites.where(created_at: from...to).size}.reverse
    @book = Book.new
end

to = Time.current.at_end_of_day
現在の日時を表す Time.current を当日の終わりの時間に設定。

from = (to - 6.day).at_beginning_of_day
at_beginning_of_day は1日の始まりの時刻を0:00に設定。

sort_by {|x| x.favorites.where(created_at: from...to).size}.reverse
from から to の期間に作成された favorites の数に基づいて、与えられた配列xの要素を並べ替えている。
最後にreverseをつけることで、昇順ではなく、降順で表示される。

Discussion