【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