今日もWebサイト作製してました、少しずつですが形になってるのが実感できてます。
検索結果のソート機能の実装
昨日までで以下のようなresult_allを格納することができましたので、今日はこれをソートするために孤軍奮闘してました。
@result_all = [{"name" => "Moira", "price" => "3000"},{"name" => "pico magic", "price" => "20000"},{"name" => "Roman", "price" => "2000"},{"name" => "Merchen", "price" => "4700"},{"name" => "Nein", "price" => "9999"}]
これを値段の高い順(Priceの降順)でsortする時は、以下のように書きます。(他メソッドから@result_allをsort_targetとして渡して実行)
def result_sort(sort_target)
@result_all = sort_target.sort { |a, b| b["price"][/\d+/].to_i <=> a["price"][/\d+/].to_i }
end
配列内の要素について、それぞれpriceの値を比較したいので、sort{ |a, b| b["price"] <=> a["price"]}となります。 しかし、これだと数値の大きさではなく辞書順になってしまうため、pico magicの20000がMoiraの3000より小さい扱いとなってしまいます。 これを防ぐための細工として、[/\d+/].to_iをつけることで数字全桁での比較としています(多分)。配列をソートする方法と、数値比較については、以下のサイトを参考にしました。
Rubyで数字の桁数が揃っていない文字列を数字順にソートする
並び替え順を指定するセレクトボックスの配置
Webサイト上にはセレクトボックスを設置しました。 form_withのヘルパー機能を使います。
index.html.erb
<%= form_with method: :post, url: pages_search_path do |form| %>
<%= form.select :selected, ApplicationRecord.sort_selections.to_a, {}, class: 'form-control' %>
<% end %>
application_record.rbにenumとしてセレクトボックスの中身を書きました。これでソートのパターンを増やしたい時にも少し書き足すだけですみます。
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
enum sort_selection: {
値段が安い順:0,値段が高い順:1
}
end
また、コントローラー側では以下のように振り分けました。(他メソッドから@result_allをsort_targetとして渡して実行)
def result_sort(sort_target)
case params[:selected]
when "0" #値段の安い順
@result_all = sort_target.sort { |a, b| b["price"][/\d+/].to_i <=> a["price"][/\d+/].to_i }.reverse
when "1" #値段の高い順
@result_all = sort_target.sort { |a, b| b["price"][/\d+/].to_i <=> a["price"][/\d+/].to_i }
end
end
参考サイト:Rails 4.2 ActiveRecord enumsを使って列挙型を扱ってみる
これでサイト上のセレクトボックスで指定された通りに、@result_allのソートができました。 思ったより色々考えることあってやはり大変ですね・・・ そろそろデザイン周りも手を付けようかな?
この記事へのコメント