ransackを使った日付検索
以前更新したransackに関してのブログ。
ransackを使って検索機能を実装する - 学習記録
predicateの種類
predicateとは「述語」という意味です。
(カラム名を)どのように検索するのかを指定するときに使えます。
ransackでは下記の方法を使って検索の範囲等を指定することができます。
カラム名_eq : 等しい
カラム名_not_eq : 等しくない
カラム名_lt : より小さい
カラム名_lteq : より小さい(等しいものも含む)
カラム名_gt : より大きい
カラム名_gteq : より大きい(等しいものも含む)
カラム名_cont : 部分一致(内容を含む)
以前更新した記事の中でも、titleカラムとbodyカラムのどちらかに一致する文字があるか探すときに、
<%= f.search_field :title_or_body_cont %>
_contを使って検索をする機能を作成していました。
日付検索の方法
まず自力でransackを使った日付検索の実装をしてみました。
「作成日が指定した日より大きくて、指定した日よりも小さい」と考えたので、下記のようなコードを書きました。
<%= f.date_field :created_at_gteq %> <%= f.date_field :created_at_lteq %>
しかしこのコードだと例えば、1月1日から1月2日までの結果を知りたいとき、
1月1日0:00から1月2日0:00の結果が出力されます。
私が予想している結果は1月1日0:00から1月2日23:59までのデータです。
なので上のコードの二つ目のコードである:created_at_lteq
を編集する必要があります。
predicateをカスタマイズする
新たにconfig/initializer配下にransack.rbというファイルを作成して、
ransackで使う新たな仕様を定義していきます。
Ransack.configure do |config| config.add_predicate 'lteq_end_of_day', arel_predicate: 'lteq', formatter: proc { |v| v.end_of_day } end
arel_predicate: 'lteq'
変更したいpredicateを指定しています。
formatter: proc { |v| v.end_of_day }
どのような内容にするか指定しています。
このようにlteq_end_of_day
を定義することで、
ビューファイルを下記のように変更し、求めている検索機能を作ることができました。
<%= f.date_field :created_at_gteq %> <%= f.date_field :created_at_lteq_end_of_day %>
参考
Custom Predicates · activerecord-hackery/ransack Wiki · GitHub