0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】お気に入り登録をした順に投稿を表示する方法

Posted at

#はじめに
本を投稿するアプリケーションにおいて、お気に入り機能を実装しました。
お気に入り本リストでの表示において、本の投稿順ではなく、
「お気に入り登録をした順番」で表示する方法をまとめます。
※お気に入り機能自体の実装には触れません。

#本投稿順での表示になるパターン
usersコントローラーにおいて@favorite_booksを取得し、
ユーザー詳細ページで表示するためにビューに渡します。

users_controller.rb(抜粋)
def show
  @user = User.find(params[:id])
  @favorite_books = @user.favorite_books
end

今回は記載を省略していますが、UserモデルとFavoriteモデルの関連付けができているため、
@user.favorite_booksにより、そのユーザーがお気に入りした本を取得することができます。
参考:【初心者向け】丁寧すぎるRails『アソシエーション』チュートリアル【幾ら何でも】【完璧にわかる】🎸
↑この記事に沿って中間テーブルを設けて実装を行いました。

ビューにおいて@favorite_booksを展開します。
_book.html.slimのパーシャルを準備し、@favorite_booksの中身を順に表示する形です。

show.html.slim(抜粋)
- if @favorite_books.any?
  - @favorite_books.each do |book|
    = render 'books/book', { book: book }

上記のように実装を行うと、ユーザー詳細ページにおけるお気に入り本リストの表示順が、
本の投稿順となります。
.favorite_booksにより一発でBookオブジェクトに変換されており、
primary_keyであるid(ここではBookオブジェクトのid)の順番で表示がされるためです。
よって、@favorite_books = @user.favorite_books.order(created_at: "DESC")
といった風に順番を指定しても、あくまで本の投稿順が降順に変更されるだけです。

#お気に入り登録をした順に表示させる方法
.favorite_booksにより一発でBookオブジェクトに変更するのではなく、
一度Favoriteオブジェクトへ変換しそこで順番の調整を行った上で、
FavoriteオブジェクトからBookオブジェクトを取り出す方法により実現できます。

users_controller.rb(抜粋)
def show
  @user = User.find(params[:id])
  @favorite_books = @user.favorites.order(created_at: "DESC").map{|favorite| favorite.book}
end

まず、@user.favoritesによりそのユーザーに関連付いたFavoriteオブジェクトを取り出し、
order(created_at: "DESC")でそれを降順に並び替えた上で、
mapメソッドを使用することによりBookオブジェクトへの変換を行なっております。

上記方法により、お気に入りリストにおいて「お気に入り登録をした順」にて本が表示されるようになります。
(他にもっといい方法がある気がしてなりません。コメントいただければ幸いです!)

0
2
0

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
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?