ActiveRecordでBETWEEN

  • 51
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。
User.where(created_at: (1.days.ago)..(Time.now))
# SELECT "users".* FROM "users"  WHERE "users"."created_at" BETWEEN '2014-09-16 15:05:05.279232' AND '2014-09-17 15:05:05.279753'

# 同じ
User.where(created_at: [1.days.ago..Time.now])

# Arelを使う
User.where(User.arel_table[:created_at].in((1.days.ago)..(Time.now)))
# SELECT "users".* FROM "users"  WHERE "users"."created_at" BETWEEN '2014-09-16 15:08:32.972344' AND '2014-09-17 15:08:32.972610'

# Squeelを使う
User.where{created_at.in (1.days.ago)..(Time.now)}
# SELECT "users".* FROM "users"  WHERE "users"."created_at" BETWEEN '2014-09-16 15:06:01.120660' AND '2014-09-17 15:06:01.120867'

以下のようなSQLを書くAPIはなさそう?

-- 今日が有効期限内
SELECT "users".*
  FROM "users"
 WHERE "2014-10-10" BETWEEN stared_at AND ended_at

↓こう書けばいいんじゃない? っていう記事ならたくさんありました

date = Date.today
User.where{ stared_at.lte(date) & ended_at.gte(date) }

余談

利用しているRDB特有の機能を使って「今日」を使うことも出来ます。
例えばPostgreSQLならcurrent_date関数を使うと今日が取得できますが、以下のようにして使います。

User.where{ updated_at > `current_date`}                                                                                 
# SELECT "users".* FROM "users"  WHERE "users"."updated_at" > current_date