Ruby on Rails noob named_scope с датой и временем - PullRequest
2 голосов
/ 10 ноября 2011

Я разработчик .net, которому вручили приложение ruby ​​on rails, потому что я посещал один урок 5 лет назад.Я действительно новичок в понимании этого приложения, но я думаю, что нашел свою проблему сейчас, мне нужна помощь, чтобы выяснить, как ее исправить.

У меня есть расписание, которое показывает проверки и временные интервалы, которые запланированы для этих проверокв.

в schedules_controller.rb

@audits = Audit.after(Date.yesterday).before(Date.tomorrow).not_canceled.find_all_by_user_id(params[:id])

в модели audit.rb У меня есть 2 именованных области действия

named_scope :after, lambda {|date| {:conditions => "date_time > '#{date} 23:59:00.000'"}}

named_scope: before, lambda {|date| {:conditions => "date_time < '#{date} 00:00:00.000'"}}

Дата и время в базе данных хранятся вВремя, так что, когда показываются все ревизии на сегодня, пропущенные на следующий день отсутствуют.Например (если в EST), если у меня сегодня аудит в 19:30, он сохраняется в базе данных с датой завтрашнего дня из-за разницы в 5 часов.Любые предложения о том, как исправить эту проблему?Приложение в рельсах 2.3.5.Спасибо!

1 Ответ

3 голосов
/ 10 ноября 2011

Вы можете передать объект времени в область вместо даты, чтобы он был более точным. При этом вы должны помнить о часовых поясах:

Time.zone = "Eastern Time (US & Canada)"
start_time = Time.zone.parse("#{Date.today} 23:59:00")
end_time = Time.zone.parse("#{Date.yesterday} 00:00:00")
@audits = Audit.after(start_time)).before(end_time).not_canceled.find_all_by_user_id(params[:id])

и области должны быть изменены следующим образом

named_scope :after, lambda {|time| {:conditions => ["date_time > ?", time]}}
named_scope :before, lambda {|time| {:conditions => ["date_time < ?", time]}}

Ключом здесь является код Time.zone.parse, который будет анализировать время, предполагая, что данная строка находится в часовом поясе, указанном строкой выше. Если вместо этого мы будем использовать Time.parse напрямую, в качестве часового пояса будет использоваться часовой пояс машины сервера.

Здесь Date.today также рискованно, так как дает дату в часовом поясе компьютера сервера. Существует два вспомогательных метода, добавленных Rails к объекту времени как beginning_of_day и end_of_day, которые будут давать правильное время. Итак, используя их, мы можем вычислить

start_time = Time.zone.now.end_of_day - 1.day
end_time = Time.zone.now.beginning_of_day + 1.day

Если в config/environment.rb вы уже определили,

config.time_zone = 'Eastern Time (US & Canada)'

или требуемый часовой пояс, вам не нужно указывать первую строку в коде (Time.zone = "Eastern Time (US & Canada)"). Для получения часовых поясов в США вы можете использовать rake time:zones:us. (Для всех часовых поясов это rake time:zones:all)

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