🌿

Rails ソート機能の実装

2023/05/06に公開

前回実装した星レビュー機能に、評価の高い順、新しい順、古い順に並び替えができるように機能を追加していきます🏋🏻

https://zenn.dev/goldsaya/articles/2746dd2b886be0

要件

  • 本の一覧ページで新着順で並ぶようにする
  • 本の一覧ページで評価の高い順で並ぶようにする
  • 本の一覧ページで新着順と評価の高い順の切り替えができる

完成

1.モデルにカラムデータの取り出し方を指示する

app/models/book.rb
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.コントローラーのアクションを追記

controllers/books_controller.rb
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. ビューにソートするためのリンクを作成

books/index.html.erb
<%= link_to '新しい順', books_path(latest: "true") %>
|<%= link_to '古い順', books_path(old: "true") %>
|<%= link_to '評価の高い順', books_path(star_count: "true") %>

これでソート機能の実装が完了しました!🙆🏻‍♀️

🌱参考にさせていただいた記事

scopeについて
https://pikawaka.com/rails/scope

ソート機能の実装
https://qiita.com/kcl215/items/c0222befe4a6b270986a

https://zenn.dev/airiswim/articles/8a4c0ea8ab2190

Discussion