イベントには多くのシフトがあります。
DATETIME 形式の列をstarts_at
含むシフト テーブル。ends_at
shifts テーブルにクエリを実行すると、starts_at
とends_at
の列は、タイムゾーン情報を含む文字列を返し、Rails によってActiveSupport::TimeWithZone
オブジェクトとして認識され、それに応じて操作できます。
結合を含むより複雑なクエリにshifts.starts_at
or列を含めると、結果セットのタイムゾーン情報が失われているようです。shifts.ends_at
次のクエリを検討してください。
SELECT events.id, events.name, events.default_shift_start,
shifts.id AS shift_id, shifts.starts_at, shifts.ends_at, users.id AS user_id,
users.first_name, users.last_name
FROM "events"
INNER JOIN "shifts" ON "shifts"."event_id" = "events"."id"
INNER JOIN "requests" ON "requests"."shift_id" = "shifts"."id"
INNER JOIN "users" ON "users"."id" = "requests"."user_id"
WHERE (events.default_shift_start > '2012-08-22 05:55:22.069340' AND requests.status = 'accepted')
ORDER BY default_shift_start ASC
編集:私はRailsでこのクエリを次の方法で呼び出しています:
Event.joins(:shifts => { :requests => :user}).where(["events.default_shift_start > ? AND requests.status = ?", Time.now, "accepted"]).select("events.id, events.name, events.default_shift_start, shifts.id AS shift_id, shifts.starts_at, shifts.ends_at, users.id AS user_id, users.first_name, users.last_name").order("default_shift_start ASC")
プロデュース:
+-----+----------+---------------------+---------- -----------+ | | ID | shift_id | starts_at | end_at | +-----+----------+---------------------+---------- -----------+ | | 17 | 80 | 2012-08-23 00:30:00 | 2012-08-23 07:30:00 | | | 17 | 55 | 2012-08-23 00:30:00 | 2012-08-23 07:30:00 | +-----+----------+---------------------+---------- -----------+
問題は、結合されたテーブル ( shifts
) の列がタイムゾーン データを返さないため、Rails がそれらを文字列データとして認識してしまうことです。データは UTC としてデータベースに保存されます。テーブルのdatetime
列をevents
同じクエリに含めると、結果にタイムゾーン データが含まれます。
ここで何が起こっているのかを理解しようとしてドキュメントを検索してきましたが、役に立ちませんでした。