😄

【Rails】投稿一覧を新着順に並べる

2023/12/26に公開

投稿一覧ページにて投稿したものを新着順に並べるための方法を復習します。

前提条件

  • 投稿機能が実装済み
  • 投稿テーブルに「created_at」というカラムが存在していること。
  • 今回の投稿テーブルはReviewになります。

コントローラ記述

現状のアクション内の記述は下記になります。

public/reviews_controller.rb
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文を表したものです。

public/reviews/index.html.erb
<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