【Rails】投稿一覧を新着順に並べる
投稿一覧ページにて投稿したものを新着順に並べるための方法を復習します。
前提条件
- 投稿機能が実装済み
- 投稿テーブルに「created_at」というカラムが存在していること。
- 今回の投稿テーブルは
Reviewになります。
コントローラ記述
現状のアクション内の記述は下記になります。
def index
@review = Review.new
@q = Review.ransack(params[:q])
if params[:q].present?
@reviews = @q.result(distinct: true)
else
@reviews = Review.all
end
end
elseの@reviews = Review.allを下記の記述に書き換えます。
@reviews = Review.all.order(created_at: :desc)
orderメソッドを使用して並び替えの条件を追加します。上記のコードでは、created_atカラムを降順で並び替えています(最新の投稿が上に表示されます)。もし昇順にしたい場合は、:descを:ascに置き換えが必要になります。
上記の修正を行うことで、投稿を作成日時の新しい順に表示されるようになります。
補足
Ruby on Railsでは、ActiveRecordクエリメソッドを使用してデータベースに対してクエリを実行することができます。これらのメソッドは、データベースからデータを取得したり、順序を変更したりするために使用されます。
Model.order(created_at: :desc) メソッドは、指定したカラム(ここではcreated_at)に対して降順(新しい順)に並び替えを行います。
Model.all メソッドは、指定されたモデル(ここではReview)のすべてのレコードを取得します。
両者を組み合わせて、@reviews = Review.all.order(created_at: :desc) を使うことで、実質的に同じ結果が得られます。
ビュー記述
下記は現状の投稿データのループ表示を行っているeach文を表したものです。
<div class='row'>
<% @reviews.each do |review| %>
<!-- 投稿の表示処理 -->
<% end %>
</div>
以下の部分を追加することで、投稿の表示順を新着順にすることができます。
<% @reviews.order(created_at: :desc).each do |review| %>
@reviews.each では、@reviews に格納された投稿データがそのままループされて表示されますが、この場合はデータベースからの取得順序はそのままです。つまり、データベースから取得した順序に従って一覧表示されます。
@reviews.order(created_at: :desc).each では、@reviews の投稿データを created_at の降順(新しい順)に並び替えてからループします。このようにすることで、新着順に投稿が表示されます。つまり、データベースから取得する順序自体が新着順になるため、ビューに表示される投稿の順序も新着順になります。
以上!!
Discussion