🔍

【Rails】検索結果の並び替え

2023/11/22に公開

検索結果の並べ替えに手こずったため、同じ悩みを持った人の解決策の1つとして使えればと思います。
これより良いやり方はあると思うので、もし変えた方が良い場所等ありましたらご教授いただければ幸いです。

前提

検索機能と並べ替え機能(検索を使わない場面で機能する状態)が実装済みであることを前提に書いています。

結論

link_toで指定したパスにparams[:query]を送る。
コントローラーで.where('post.title LIKE ?', "%#{params[:query]}%") を付け足す。

解説

Viewでの記述

<%= link_to 'いいね数順', public_search_path(sort: 'likes', query: params[:query]) %>

検索結果を'いいね'の数が多い順に並び変えるようにします。
sort:'likes'で、いいね数順にソートすることを指定しています。
query: params[:query]は、現在のクエリを保持するためのパラメータです。
したがって、このコードはリンクをクリックすると検索結果を保持したまま、いいねの数順に並び変えます。

controllerでの記述

def search
    case params[:sort]
    when 'likes'
    @results = Post.left_joins(:likes).group('posts.id').order('COUNT(likes.id) DESC').where('posts.title LIKE ?', "%#{params[:query]}%")
    else
    @results = Post.where('posts.title LIKE ?', "%#{params[:query]}%").order(created_at: :desc)
    end
  end

Post.left_joins(:likes):指定したソートの種類('likes')を結合します。これにより、投稿といいねの関連情報を一緒に取得できます。
.group('posts.id'):IDごとに結果をグループ化します。これにより、同じ投稿が複数回表示されることを防ぎます。
.order('COUNT(likes.id) DESC'):いいねの数を降順に並べます。
.where('posts.title LIKE ?', "%#{params[:query]}%"):タイトルが指定したものと一致した投稿を検索します。(このメソッドがないと検索結果だけでなく、全てが対象になってしまいます。)



以上のようにすることで、検索結果で出たものを並べ替えできます。
これは1例でしかありません。他にやり方があれば是非コメントでおしえてください^^

Discussion