某フリマサイトの検索まとめ(後編)

某フリマサイトのコピーをRailsにて作成した際にransackによる検索をする方法をまとめました

URL:https://github.com/yusuke-ishizaki/freemarket_sample_50b


Ransackによる条件検索


——————————————————
・必要なもの
Gem”ransack” gem”active hash”


—————————————————
・詳細検索作成手順
1. ransack 導入
2. コントローラー記述
3. フォーム制作
4. ActiveHash導入(gem,モデル) ←ここから
5. ActiveHash導入(アソシエーション)
6. フォーム作成2
↓詳細

————————————————

4.ActiveHash 導入

検索する際にセレクトボックスやチェックボックスの記述があるが、ここでデータベース内の値を引っ張ってきたい

このときにActiveHashを用いる

Activehashを用いる状況として

・基本的に’select option’使いたくない

・セレクト数が多くviewに記述したくないとき(ex.都道府県セレクト)

・テーブルを作るほどでもないセレクトメニュー(ex.メルカリのサイズ、状態など)

導入手順

gem 'active_hash'  →bundle install  rails s

・モデルの作成(ここにデータを記述)

$rails g model”コマンドを使わずに/app/model/~.rbを作成

→class モデル名(任意) < ActiveHash::Base

  self.data = [

   {id: 1, name: ’’}, {id: 2, name: ''}

  ]

end

データはハッシュでベタ打ち

今回は/app/models/size.rb status.rb

 

 

 

5.ActiveHash導入(アソシエーション)

Activehashに必要なアソシエーションを組んでいく

入力検索フォームで値を引っ張りたいモデル(Product) と activehashでデータを格納してるモデル(Size)  でアソシエーションを組みデータを引っ張れるようにする

新しく作ったactivehashモデルにはアソシエーションは書かず、値を引っ張る側にアソシエーション を記述する

/app/models/product.rb

class Product < ApplicationRecord

   extend ActiveHash::Associations::ActiveRecordExtensions

   belongs_to_active_hash :hash先モデル

end

 

 

 

6.フォーム作成2

フォームのセレクト欄とチェックボックスを作成していく

セレクトフォーム…= f.collection_select

チェックボックス…= f.collection_check_boxes

 

・セレクトフォーム

= f.collection_select(オブジェクト名, オブジェクトの配列, value属性の項目, テキストの項目 [, オプション])

 オブジェクト名属性名:フォームの対象モデルの中の該当する属性名

 オブジェクトの配列配列名:セレクトメニューの選択するのに使用するデータの配列。連想配列かオブジェクト

 value属性の項目valueになるカラム名:セレクトメニューで値として扱うカラムの名前※optionvalueの値になる

 テキストの項目表示されるカラム名:セレクトメニュー表示名として扱うカラム名

今回は”= f.collection_select :size_eq, Size.all, :id, :name, { include_blank: 'すべて'}, { class: "search-box__detail-search__form-group__input" }

[search.html.haml L27]

productviewの中なのにSize.allが使用できるのはクラスメソッドはどこからでも呼び出せるため

 

チェックボックス

= f.collection_check_boxes オブジェクト名, オブジェクトの配列, value属性の項目, テキストの項目 [, オプション] do |b|

  = b.check_box

       = b.text

今回は”= f.collection_check_boxes :status, Status.all, :name, :name, prompt: '--' do |b|

[search.html.haml L39]