LoginSignup
1
1

More than 5 years have passed since last update.

昨日作成されたレコードを取得するwhereの書き方(Railsガイド写経)

Posted at

  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、ほんま賢いわー。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1