Railsでお手軽に検索機能を実装するならRansackですよね。
日付を期間指定で検索する方法です。
purcharsed_historiesテーブルのpurchased_dateカラム(datetime型)を対象にしています。
ransackのマッチャーであるgt
とlt
、eq
を組み合わせることで実装できます。
<%= 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に定義したのでサーバー再起動してから確認してください。
コメントを残す