Rails ソート機能の実装
前回実装した星レビュー機能に、評価の高い順、新しい順、古い順に並び替えができるように機能を追加していきます🏋🏻
要件
- 本の一覧ページで新着順で並ぶようにする
- 本の一覧ページで評価の高い順で並ぶようにする
- 本の一覧ページで新着順と評価の高い順の切り替えができる
完成
1.モデルにカラムデータの取り出し方を指示する
scope :latest, -> {order(created_at: :desc)}
scope :old, -> {order(created_at: :asc)}
scope :star_count, -> {order(star: :desc)}
このスコープの意味
:latest : 最新のものから順に並べる
:old : 古いものから順に並べる
:star_count : 星の数が多い順に並べる
order = データの取り出し
created_at = 投稿日のカラム
desc = 昇順
asc = 降順
これらのスコープを使用することで、
データベースから取得するレコードを特定の順序で取得できる!
例えば、Book.latestというコードを実行することで、Bookモデルのレコードを作成日時の新しい順に取得することができ、同様に、Book.star_countというコードを実行することで、星の数が多い順に並べたBookモデルのレコードを取得できる🙆🏻♀️
scopeメソッド
モデル側で共通の条件式(クエリ処理)に名前を付けて定義し、
その名前でメソッドのように呼び出すことができる仕組みのこと。
class モデル名 < ApplicationRecord
scope :スコープの名前, -> { 条件式 }
end
💡カラムをターミナルで確認する方法
rails runner 'puts モデル名.column_names'
ちなみに、Railsには、全てのデータベーステーブルに対して自動的に created_at と updated_at という2つのカラムが追加されている。
created_at
はレコードがデータベースに保存された時刻を表す。この値は、レコードが作成された瞬間に自動的に設定される。
一方、updated_at
はレコードが最後に更新された時刻を表す。この値は、レコードが更新されるたびに自動的に更新される。
これらのカラムは、主にデータの作成日時や更新日時を追跡するために使用される。アプリケーションでタイムスタンプを必要とする場合にも便利🙆🏻♀️
2.コントローラーのアクションを追記
def index
:
省略
:
if params[:latest]
@books = Book.latest
elsif params[:old]
@books = Book.old
elsif params[:star_count]
@books = Book.star_count
else
@books = Book.all
end
:
end
if params[:latest]
ビューからの指示を受けるための名前を定義。
これは後でビューへ記述するlatestと繋がっている。
@books = Book.latest
このlatestは先ほどモデルへ記述したlatestへ繋がっている。
処理の流れを理解するとわかりやすい💪🏻
3. ビューにソートするためのリンクを作成
<%= link_to '新しい順', books_path(latest: "true") %>
|<%= link_to '古い順', books_path(old: "true") %>
|<%= link_to '評価の高い順', books_path(star_count: "true") %>
これでソート機能の実装が完了しました!🙆🏻♀️
🌱参考にさせていただいた記事
scopeについて
ソート機能の実装
Discussion