2014-12-21 3 views
0

Я пытаюсь сохранить datetimes в событиях в MongoDB с Mongoid. Трудность состоит в том, что я хочу сохранить их для разных часовых поясов (например, в Берлине и Лондоне). Я хочу, чтобы пользователь (администратор) видел фактическое время в часовом поясе, так что ему не нужно вычислять. Впоследствии у меня есть задание cron, когда каждый раз, когда каждый процесс просматривается, он смотрит каждую минуту.Rails - Как правильно сохранить даты в MongoID и запускать их с помощью iferver (cronjobs)?

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

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 в событиях # новых для того, чтобы изобразить фактическое время часового пояса, в в simple_form. Кажется, что это работает, но затем метод создания контроллера, похоже, снова обрабатывает параметры как стандартный часовой пояс и неправильно его трансформирует (+ 1 час при экспериментировании с Лондоном/Берлином). Я пробовал почти каждую комбинацию параметров, а также Time.now/Time.zone.now. В индексе события # я переключаюсь через time_zones, чтобы показать нужное время.

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

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

ответ

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 

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

+0

Это помогло. Спасибо Основная проблема заключалась в переключении Time.zone, которое произошло после того, как была запущена модель, и уже установленная метка времени. – Luis