🍡

[Rails]並べ替え機能の実装

2023/10/08に公開

今回作る機能

家にあるストック用の食品などの期限を管理するアプリケーションの作成中。
今回は、登録したアイテムを「期限が近い順」「登録が新しい順」「登録が古い順」に並び替える機能を作る。

実装ステップ

  • モデルに対して、データを取り出す順番を指定する記述を追加
  • コントローラーで、どの条件で並べ替えるかを指定
  • ビューに、並べ替えを実行するためのボタンを設置

各ステップの詳細

モデルに対して、データを取り出す順番を指定する記述を追加

  scope :latest, -> { order(created_at: :desc)}
  scope :old, -> { order(created_at: :asc)}
  scope :deadline, -> { order(deadline: :asc)}
  • 「scope機能」とは
    モデル側であらかじめ特定の条件式に対して名前をつけて定義し、その名前でメソッドの様に条件式を呼び出すことが出来る仕組みのこと(参照元

今回のアプリ独自の並べ替え基準としては「期限が近い順」がある。
itemテーブルのdeadlineカラムの日時を使用したいので、3行目のような記述を行なった。

コントローラーで、どの条件で並べ替えるかを指定

  def index
    if params[:latest]
      @items = Item.latest
    elsif params[:old]
      @items = Item.old
    elsif params[:deadline]
      @items = Item.deadline
    else
      @items = Item.all
    end
  end

この後記述するビュー側で、どの基準で要素を並べるか指定するparamsを送信できるようにするので、そのparamsを受け取って実行できるよう、paramsごとにif条件を設定する。

ビューに、並べ替えを実行するためのボタンを設置

<%= link_to '古い順', items_path(old: "true") %>
<%= link_to '新しい順', items_path(latest: "true") %>
<%= link_to '期限の近い順', items_path(deadline: "true") %>

今回は、並べ替え項目ごとにリンクを設置する。

完成したもの

参考にした記事

https://qiita.com/kcl215/items/c0222befe4a6b270986a

Discussion