Проблема со сравнением времени в Rails AR Query - PullRequest
0 голосов
/ 08 марта 2011

Я использую Rails 3.0.4 с базой данных PostgreSQL и создал поле DateTime с именем ordered_at.

Я установил его созданием с помощью Time.now, и я хочу запросить в поле order_at что-то вроде where("ordered_at > ?", params[:later_than], но если я укажу позже, чем с чем-то вроде 1.minute.from_now, я получу результатыгде никаких результатов не должно быть.

Подробно: ordered_at равно 2011-03-08 11:11:49 и params[:later_than] равно 2011-03-08 11:09:58 UTC.

Я думаю, что это из-за часового пояса в объекте Time, которого нет в базе данных (поле order_At - timestamp without time zone Datatype).

У кого-нибудь была такая же проблема, и она может мне помочь?

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Исправлено.Корень зла был в моих приспособлениях.

Вы должны установить время в своих приспособлениях так:

  ordered_at: <%= (30.minutes.ago).iso8601 %>

в противном случае вы получите часовой пояс базы данных / сервера

0 голосов
/ 08 марта 2011

Помните, что Rails хранит время в вашей базе данных в формате UTC.Rails конвертирует время в UTC и устанавливает его как стандарт для просмотра в базе данных.Поэтому, если у вас есть params[:later_than] как 2011-03-08 11:11:49 UTC или любое другое время для любого часового пояса, Rails преобразует его в часовой пояс UTC перед вставкой в ​​запрос SQL.Если вы сохраняете Time.now в базу данных, Time.now будет временем сервера или локального компьютера с часовым поясом, в котором установлен компьютер.Перед сохранением в базу данных Rails преобразует его в UTC и сохраняет его.Таким образом, на уровне базы данных все будет преобразовано в UTC, а затем будет сопоставлено, чтобы избежать путаницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...