Ransackでコンボボックスの検索時に選択無し状態を設定する

何かの画面で検索を行うときには activerecord-hackery/ransack を使用することが多いと思います。柔軟なクエリ検索が行えて、それを画面から使用するためのhelperまで用意されているからです。

Ransackとは?

Ransackの詳細については下記のスライドやサイトがわかりやすいと思います。

Ransackがどのようなものかが詳しく説明されています。

ransack, ransack, ransack

Ransackをフォームで使用する説明がされています。 Rails - 検索用のgem「ransack」を使ってみる - Qiita

チュートリアル的なRansackの使い方が説明されています。 market_id_eq

未選択状態の実現

その Ransack で検索項目にコンボボックスを設定するようなときに検索対象を選択しない状態をどのように実現するのかですが、とても簡単で select タグを生成するときに設定する

[ruby] include_blank: true [/ruby]

オプションを追加すれば実現できます。

具体的には…

以下のような検索ボックスが存在した場合にオプションをつけない場合にはブランクを選択することができません。

ransack_2014_11_01

一方で、オプションを設定すると以下の通りブランクを選択可能な状態となります。

ransack_2014_11_2

実はこれは select メソッドに定義されているオプションを使用しているためどちらかというと ransack に特化した機能ではありません。

なお、先ほどのスクリーンショットのコンボボックスは下記のようなタグとなっています。

[ruby] <%= f.select :keihi_himoku_name_eq, options_from_collection_for_select(@keihi_himokus, 'keihi_himoku_name', 'keihi_himoku_name', @q.keihi_himoku_name_eq), include_blank: true %> [/ruby]

Railsではいろいろなgemを使用しますが、基本はRailsのライブラリがどのようになっているかを理解しているのが重要なな気がします。それぞれがRailsのライブラリを拡張して実現されている機能であることが多いためです。 とくに、view_helper 周りについてはいろいろと複雑なためこんがらがってしまいますが…。

おわりに

Ransackに関する参考書籍は単独ではないですが以下のものにも少し説明が行われています。

P.226 から数ページほど基本的な説明があります。

一歩先ゆくRuby で少し利用方法が説明されています。

view_helperの説明については一番参考にしやすい書籍だと思います。