Ransackでチェックボックス検索を実装した時にはまったこと

最近 Ransack でチェックボックスの検索を実装した時に少し嵌ったので、メモを残しておきます。

前提

こんな感じのモデルがあるとして、premierのプロダクトだけを調べるためのチェックボックスを実装する想定。

class Product < ApplicationRecord
  enum status: { normal: 0, premier: 1 }
end

View では下記のようにチェックボックスを実装。

= f.check_box :status_eq
span Published

問題

上記の実装だとチェックをつけたときに、プレミアムだけの絞込みはうまく機能します。
しかし、チェックを外したとき、normalだけの絞り込みになってしまいます。理由は、チェックを外したとき、status_eq=0が hidden フィールドで送信されるためです。

解決策

include_hidden: falseを指定するか、f.check_box :status_eq, {}, 1, nilのような指定をすれば解消できます。ただし、ransackable_scopesを使っている場合だと、後者の指定だとチェック状態が検索結果画面で維持できなかったため、僕はinclude_hidden: falseで対応しました。

参考