Ransackをインストールする。
Gemfileに下記の記述を追加します。
1 |
gem 'ransack' |
bundleインストールする。
1 |
bundle |
Railsを再起動します。
Ransackが提供するコントローラで使えるメソッド
検索するメソッド
対象のモデルから検索画面で指定したパラメータで検索を実行します。
1 |
モデルオブジェクト.ransack(params[:q]) |
検索結果を返すメソッド
上記の検索するメソッドにて取得した結果オブジェクト(Ransack::Searchオブジェクト)に対してresultメソッドを使うことで検索対象のオブジェクトに絞ることができます。
1 |
Ransack::Searchオブジェクト.result(オプション) |
:distinct
検索結果が複数同じものが出てきた場合は重複を排除します。(SQLのdistinctと同じ)
Ransackが提供するビューで使えるヘルパー
search_form_for
検索用のフォームを画面に追加できます。
sort_link
表のカラムに昇順、降順と交互に入れ替えるリンクを追加することができます。
1 |
sort_link(Ransack::Searchオブジェクト,対象カラム) |
検索マッチャー
ransackが用意している検索マッチャーです。formの各入力フィールドのname属性に指定します。内部的にはSQL文を作成しています。
(検索対象カラム)_cont
containsの略で検索文字列を含むものを検索します。
(検索カラム)_gteq
greater than or equalの略で検索フォームに入力した値と同じかそれより大きいものを検索します。
検索できるカラムを絞るには?
現状、フィールドのname属性でransackが検索できる機能を絞っています。ただ、ユーザーが意図的にname属性の値を書き換えることで他のカラムについても検索することが可能になってしまいます。
モデル(app/models/モデル名.rb)に下記の記述を追加します。許可するカラムに指定したカラムでしかransackでは検索ができなくなります。
1 2 3 |
def self.ransackable_attributes(auth_object = nil) %w[許可するカラム1 許可するカラム2] end |
もちろん、Strong Parameterでも入ってくる値を制御することは可能でしょうがこのようにransackの機能を使って制限するのが一般的になっています。(Strong Parameterはコントローラーのソースコードに入ってくるものでソースが玉石混交になりやすいためです。)
この記事へのコメントはありません。