🍡
[Rails]並べ替え機能の実装
今回作る機能
家にあるストック用の食品などの期限を管理するアプリケーションの作成中。
今回は、登録したアイテムを「期限が近い順」「登録が新しい順」「登録が古い順」に並び替える機能を作る。
実装ステップ
- モデルに対して、データを取り出す順番を指定する記述を追加
- コントローラーで、どの条件で並べ替えるかを指定
- ビューに、並べ替えを実行するためのボタンを設置
各ステップの詳細
モデルに対して、データを取り出す順番を指定する記述を追加
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") %>
今回は、並べ替え項目ごとにリンクを設置する。
完成したもの
参考にした記事
Discussion