コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

ActiveSupportにはdate型に対してその日の範囲を作るall_dayというメソッドがある

前にまとめたけど、こんなんのもあるのかというメモ

環境

$ bin/rails --version
Rails 5.2.2

やり方

all_dayメソッドを使うだけ

date = "2019-08-17".to_date
# => Sat, 17 Aug 2019

date.all_day
# => Sat, 17 Aug 2019 00:00:00 UTC +00:00..Sat, 17 Aug 2019 23:59:59 UTC +00:00

使い所

例えばActiveRecordで範囲計算をするとき、date型をうっかり入れてしまうと時間情報が欠落してしまうので、上手く行かない場合がある。 その場合は allday をつかって範囲をとってあげるといい

例えばこんなUserがあって

User.last.created_at
#  User Load (0.3ms)  SELECT  `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
#=> Sat, 17 Aug 2019 07:43:19 UTC +00:00

date型でwhere文を作るとうまくいかない

date = "2019-08-17".to_date
# => Sat, 17 Aug 2019

User.where("created_at <= ?",date).pluck(:id)
#   (0.3ms)  SELECT `users`.`id` FROM `users` WHERE (created_at <= '2019-08-17')
=> []

そのため、all_dayを使ったほうが確実に取れる

User.where(created_at: date.all_day).pluck(:id)
#   (2.2ms)  SELECT `users`.`id` FROM `users` WHERE `users`.`created_at` BETWEEN '2019-08-17 00:00:00' AND '2019-08-17 23:59:59'
#=> [5]

参考リンク