Rails - Как правильно сохранить дату и время в MongoID и запустить их с помощью whenerver (cronjobs)?

Я пытаюсь сохранить дату и время в событиях в MongoDB с помощью Mongoid. Сложность в том, что я хочу сохранить их для разных часовых поясов (например, Берлина и Лондона). Я хочу, чтобы пользователь (админ) видел реальное время в часовом поясе, чтобы ему не нужно было считать. После этого у меня всегда есть задание cron, которое каждую минуту ищет событие для обработки.

У меня есть следующие параметры:

application.rb (я пробовал без -> стандартное UTC -> в Лондоне все в порядке, в Берлине неправильный час)

config.time_zone = 'Berlin'  # as the server stays in Germany

mongoid.yml (пробовал все комбинации, но нужно использовать use_activesupport_time_zone, чтобы получить правильное время в oDB)

use_activesupport_time_zone: true    
use_utc: false

schedule.rb (пока проблем нет)

every 1.minutes do
 runner "Event.activate_due", environment: 'development'
end

event.rb (не уверен, какое время я сейчас смотрю)

def self.activate_due
  events_due = Event.where(:eventStart.lte => (Time.now  + 1.minute), :eventStart.gte => (Time.now))
  events_due.each do |e|
    e.activate
  end
end

Я попытался изменить Time.zone в событиях # new, чтобы отобразить фактическое время часового пояса в простой_форме. Кажется, это работает, но затем метод создания контроллера, кажется, снова обрабатывает параметры как стандартный часовой пояс и неправильно преобразует его (+-1 час при экспериментировании с Лондоном/Берлином). Я пробовал почти все комбинации параметров, а также Time.now/Time.zone.now. В event#index я переключаюсь между часовыми поясами, чтобы показать правильное время.

Немного усложняю: я сохраняю часовой пояс в модели области, которая связана через areaId с моделью событий.

Как мне показать администратору в форме правильное время для события в зоне, которую он хочет добавить (не его часовой пояс), и правильно сохранить его в Mongo, чтобы позже вызвать его через cronjob?


person Luis    schedule 21.12.2014    source источник


Ответы (1)


Попробуйте следующее

def self.activate_due
  events_due = Event.where(
     :eventStart.to_utc.lte =>(Time.now.to_utc),
     :eventStart.to_utc.gte => (1.minute.ago.to_utc))
  events_due.each do |e|
    e.activate
  end
end

Пожалуйста, обратите внимание, что это будет работать с временем UTC, поэтому, если у вас есть событие в часовом поясе UTC - 7, не думайте, что оно активируется сейчас, если часовой пояс сервера UTC + 2.

person a14m    schedule 22.12.2014
comment
Это помогло. Спасибо. Основная проблема была в переключении Time.zone, которое произошло один раз после того, как модель была инициирована, и временная метка уже была установлена. - person Luis; 22.12.2014