sessionの利用で検索結果からのソートを実装

railsに関して表題の件でうまくできなかった為、備忘録

検索結果を表示させ、その中で

新しい順

古い順

いいねの多い順

で並び替えるように実施

 

・ビューファイルにてセレクトボックスの表示

app/views/posts/sort.html.erb

 
<%= form_with(url: sort_posts_path, method: :get, local: true, class: "search-form-sort") do |f| %>

<%= f.select :sortword,[
["投稿が新しい順","new"],
["投稿が古い順","old"],
["いいねが多い順","likes"],], class: "input-box-sort"%>

<%= f.submit "並び替える", class:"sort-box" %>
<% end %>

sortwordとして選択することでソートを実行させる

次にコントローラー

app/controller/postscontroller.rb

def search
@posts = Kaminari.paginate_array(Post.search(params[:keyword]).reverse)
.page(params[:page]).per(4)
session["search"] = params[:keyword]
#キーワードは検索ワード、これをsessionで保持したままsortアクションにも使えるようにする
selection = params[:sortword]
end

def sort
selection = params[:sortword]
 
if selection == 'new' #newを選んだ時
@posts = Kaminari.paginate_array(Post.search(session["search"]).reverse)
.page(params[:page]).per(4)
 
elsif selection == 'likes'  #likesを選んだ時
@posts = Kaminari.paginate_array(Post.find(Good.group(:post_id)
.order(Arel.sql('count(post_id) desc')).pluck(:post_id))&
(Post.search(session["search"]))).page(params[:page]).per(4)
#いいねがついている全てのpostを並び替えして取得、それを検索語と一致したもののみ抽出
 
else #oldを選んだ時
@posts = Kaminari.paginate_array(Post.search(session["search"]))
.page(params[:page]).per(4)
end
 
end

検索とページングに関しては後日まとめるが、今回はlikesの時の順番に時間がかかってしまった。

結局方法としては

いいねがついている全てのpostをいいね順に並び替えして取得した配列と検索語と一致したものの共通の値を取得することで並び替えたものを抽出した。

配列の比較をする際は順番にも気を付ける。

 

ちなみにsessionは大きなデータは引き継げない、画像などのバイナリデータは避ける。