Ransackで日付検索を期間指定する方法

github.com

Railsでお手軽に検索機能を実装するならRansackですよね。
日付を期間指定で検索する方法です。
purcharsed_historiesテーブルのpurchased_dateカラム(datetime型)を対象にしています。
ransackのマッチャーであるgtlteqを組み合わせることで実装できます。

Ransack/Searching

<%= search_form_for @q, url: purchased_histories_path do |f| %>
<%= f.date_field :purchased_date_gteq %>
~
<%= f.date_field :purchased_date_lteq %>
<% end %>

しかし、この実装だとクエリーの時間が0時00分00秒で走ってしまいます。この結果どういうことが起こるかというと、

  • ①11月11日11時11分のレコードがある。
  • 例えば11月10日〜11月11日で検索をかける
    →①が表示されない!

11月11日までの検索条件だと、11月11日0時00分までが検索対象になるので①が表示されません。

11月11日までの検索条件だと通常11月11日23時59分までを検索対象にしたいですよね。

そんな時は自分でカスタムする必要があります。

Custom Predicates · activerecord-hackery/ransack Wiki · GitHub

config/initializers/ransack.rb

Ransack.configure do |config|
config.add_predicate 'lteq_end_of_day',
:arel_predicate => 'lteq',
:formatter => proc {|v| v.end_of_day},
:compounds => false
end

今回は`lteq_end_of_day’という名前で定義したのでviewで適用させます。

<%= search_form_for @q, url: purchased_histories_path do |f| %>
<%= f.date_field :purchased_date_gteq %>
~
<%= f.date_field :purchased_date_lteq_end_of_day %>
<% end %>

initializersに定義したのでサーバー再起動してから確認してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です