ransackを使った日付検索で指定した日付の前日までのデータしか取得できないのを修正

問題

ransackで oooo/oo/oo から xxxx/xx/xx までというふうに日付検索ができるようにしていたのですが、

そのままだと xxxx/xx/xx の部分の時間が00:00:00となってしまう事で、指定した日付の前日までのデータしか取得できませんでした。

 

2019-03-01から2019-03-01までで検索すると以下のようなSQLが発行されてしまい、2019-03-01に作成されたデータは取得できません。。。

Hoge Load (0.6ms)  SELECT  "hoges".* FROM "hoges" WHERE ("hoges"."created_at" >= '2019-03-01 00:00:00' AND "hoges"."created_at" <= '2019-03-01 00:00:00') ORDER BY "hoges"."created_at" DESC LIMIT $1 OFFSET $2

 

解決法

それを直すために、以下のようにlteq_end_of_dayというメソッド?を追加しました。

config/initializer/ransack.rb

Ransack.configure do |c|
  略

c.add_predicate 'lteq_end_of_day',
arel_predicate: 'lteq',
formatter: proc {|v| v.end_of_day},
compounds: false
end

 

ビューで xxxx/xx/xx までの部分に、定義したlteq_end_of_dayメソッドを使ってあげます。


= f.text_field(:created_at_gteq, class: "datepicker")
| から
= f.text_field(:created_at_lteq_end_of_day, class: "datepicker")
| まで

 

これできちんと指定した日付のデータも検索結果に含まれるようになりました!

SQLを確認してみてもきちんと 2019-03-01 00:00:00 から 2019-03-01 23:59:59.999999 までというようにデータを検索してくれております。

Hoge Load (0.6ms)  SELECT  "hoges".* FROM "hoges" WHERE ("hoges"."created_at" >= '2019-03-01 00:00:00' AND "hoges"."created_at" <= '2019-03-01 23:59:59.999999') ORDER BY "hoges"."created_at" DESC LIMIT $1 OFFSET $2