Railsガイド、Active Record クエリインターフェイス、2.3.2 範囲条件 の写経による、小ネタになります。
顧客を表すClient
というモデルがあり、昨日作成されたレコードを取得するActiveReocrdクエリは
以下のように書ける。
Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)
こういう 1.day
の使い方、カッコええやん。ちなみに1.day
は何かといえば、
irb> 1.day.class
=> ActiveSupport::Duration
ActiveSupport::Durationのオブジェクト。
テストデータを作成して上記を写経。上記の where
から、以下のようなBETWEEN
が作成される。
irb> Time.now
=> 2017-02-24 13:08:05 +0900
irb> Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight)
Client Load (0.7ms) SELECT `clients`.* FROM `clients` WHERE (`clients`.`created_at` BETWEEN '2017-02-23 00:00:00' AND '2017-02-24 00:00:00')
=> #<ActiveRecord::Relation [#<Client id: 201, name: "顧客-01", created_at: "2017-02-22 19:31:36", ・・・
ここまではRailsガイドに書いてあるとおり。
では、created_at:
で指定している期間を、..
から...
に変え、
Client.where(created_at: (Time.now.midnight - 1.day)...Time.now.midnight)
とするとどうなるか。
やってみると、
irb> Client.where(created_at: (Time.now.midnight - 1.day)...Time.now.midnight)
Client Load (0.7ms) SELECT `clients`.* FROM `clients` WHERE (`clients`.`created_at` >= '2017-02-23 00:00:00' AND `clients`.`created_at` < '2017-02-24 00:00:00')
=> #<ActiveRecord::Relation [#<Client id: 201, name: "顧客-01", created_at: "2017-02-22 19:31:36", ・・・
と、ちゃんと期待どおり、BETWEEN
ではなく、下限以上、上限未満のWHERE
句が生成されました。
ActiveRecord、ほんま賢いわー。