#はじめに
本を投稿するアプリケーションにおいて、お気に入り機能を実装しました。
お気に入り本リストでの表示において、本の投稿順ではなく、
「お気に入り登録をした順番」で表示する方法をまとめます。
※お気に入り機能自体の実装には触れません。
#本投稿順での表示になるパターン
users
コントローラーにおいて@favorite_books
を取得し、
ユーザー詳細ページで表示するためにビューに渡します。
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
の中身を順に表示する形です。
- 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
オブジェクトを取り出す方法により実現できます。
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
オブジェクトへの変換を行なっております。
上記方法により、お気に入りリストにおいて「お気に入り登録をした順」にて本が表示されるようになります。
(他にもっといい方法がある気がしてなりません。コメントいただければ幸いです!)