web-dev-qa-db-ja.com

Rails 2回のクエリ

Checkinモデルを持つRailsアプリがあります。当日の特定の時間範囲内にあるすべてのレコードを検索したいのですが、whereを記述して、すべてのレコードを取得するにはどうすればよいですか。午後12時から午後4時30分までに作成されましたか?

13
Kyle Decot

@ x1a4の答えはあなたにとって良いはずですが、範囲を使用して、より読みやすく、より短い方法でそれを行うことができます。

_ Checkin.where(created_at: Time.parse("12pm")..Time.parse("4:30pm"))
_

次のようなものが生成されます。

_SELECT "checkins".*
FROM "checkins" 
WHERE ("checkins"."created_at" BETWEEN '2012-05-28 12:00:00.000000' AND '2012-05-28 16:30:00.000000')
_

Time.parse("12pm")を他の方法で変更して、時間を作成できます。

48
Ismael Abreu

これは、UTCタイムゾーンを想定すると機能するように見えます。

Record.where('created_at > ? AND created_at < ?', Date.today + 12.hours, Date.today + 16.5.hours)

またはBETWEENを使用:

Record.where('created_at BETWEEN ? AND ?', Date.today + 12.hours, Date.today + 16.5.hours)

BETWEENには、範囲の2番目の値が含まれる場合と含まれない場合があります。 Postgresにはそれが含まれています

10
x1a4

以下のgemを使用して、日付間のレコードを見つけることができます。

これ gem 非常に使いやすく、より明確です[星別] [1]。私はこのgemを使用していますが、APIはより明確で、ドキュメントも十分に説明されています。

_Post.between_times(
 Time.zone.now - 3.hours,  # all posts in last 3 hours
 Time.zone.now
)
_

ここでは、フィールドもPost.by_month("January", field: :updated_at)に渡すことができます。

ドキュメントを参照して試してください。

0
Jenorish