学習記録

アウトプット用に作りました

ransackを使った日付検索

以前更新したransackに関してのブログ。
ransackを使って検索機能を実装する - 学習記録


predicateの種類

predicateとは「述語」という意味です。
(カラム名を)どのように検索するのかを指定するときに使えます。

ransackでは下記の方法を使って検索の範囲等を指定することができます。

以前更新した記事の中でも、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