管理画面等で役立つ、超簡単なデータの並び替えについて備忘録として残しておきます。
主に使うものは
- link_to(view)
- 条件分岐(controller)
- scope(model)
です。
前提として、articleモデルにある適当なデータを一覧にして、それを並び替えます。
データ一覧ページへのパス: articles_path
ビュー: index.html.erb
コントローラー: articles_controller.rb
モデル: article.rb
ソート切り替え用のリンクを設置
まず、並び替えをしたい画面でそのトリガーとなるリンクを設置します。
viewファイルに以下のように記述します
<div>
# ソート切り替え用リンク
<%= link_to '新しい順', articles_path(latest_created_at: true) %>
<%= link_to '古い順', articles_path(old_created_at: true) %>
</div>
<div>
# 全てのarticleのcontentカラムを表示
<% @articles.each do |article| %>
<%= article.content %>
<% end %>
</div>
latest_created_at: とかold_created_at: はcontrollerでデータ取得のやり方について条件分岐を行うために受け渡すパラメーターです。
後で出てくるのでとりあえず置いときます。
ソートのためのデータ取得をscope化する
modelファイルで、レコードを新しい順と古い順に取得するための処理をscope化しておきます。
scope :latest_created_at, -> {order(unsubscribed_at: :desc)} #新しい順
scope :old_created_at, -> {order(unsubscribed_at: :desc)} #古い順
scopeとして処理をまとめておくことで、controllerでデータを取得する際に簡単な記述で処理を行うことができます。
また、ここで出てくるlatest_created_at: 、old_created_at: はscope名であり、パラメーター名のものとは別物ですが今回は統一します。
controllerでデータ取得の条件分岐を行う
viewファイルに設置したリンクを踏むことで、データの取得法を切り替えるための条件分岐をcontrollerの中で行います。
if params[:latest_unsubscribed_at]
@articles = Article.latest_created_at
elsif params[:old_unsubscribed_at]
@articles = Article.latest_created_at
end
paramsによって受け取っているパラメーターは、viewファイル内にあるリンクを踏むことによって受け渡されます。
つまり、新しい順に並び替える用のリンクを踏むと、params[:latest_unsubscribed_at]には"true"が代入され、@articlesには、レコードを新しい順に取得するscopeを用いて代入されます。
まとめ
以上で、最低限のソート切り替えを実装することができました。
ユーザー用に実装する場合は、画面更新なしで見た目が切り替わったりするといいんでしょうけど、今回はそこまでは至りませんでした。
何かおかしなところや問題点がございましたら、ぜひご教授ください!