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