某フリマサイトの検索まとめ(後編)
某フリマサイトのコピーを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になるカラム名:セレクトメニューで値として扱うカラムの名前※optionのvalueの値になる
テキストの項目→表示されるカラム名:セレクトメニュー表示名として扱うカラム名
今回は”= f.collection_select :size_eq, Size.all, :id, :name, { include_blank: 'すべて'}, { class: "search-box__detail-search__form-group__input" }”
[search.html.haml L27]
※productのviewの中なのに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]