地方でリモートワーク

プログラミング、先物、fx,仮想通貨なんでもやります

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に定義したのでサーバー再起動してから確認してください。