作ったもの、プログラミングで共有できそうなこと、IT関連でやってみたことなど、なんでも書いていきます。ヤドン可愛い

今日も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で二次元配列をsortしたい

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のソートができました。 思ったより色々考えることあってやはり大変ですね・・・ そろそろデザイン周りも手を付けようかな?

この記事へのコメント

まだコメントはありません