Rails - 如何在MongoID中正确保存日期时间并使用whenerver(cronjobs)触发它们?

时间:2014-12-21 14:16:41

标签: ruby-on-rails timezone mongoid whenever

我尝试使用Mongoid将日期时间保存到MongoDB中的事件中。困难在于我想将它们保存在不同的时区(例如柏林和伦敦)。我希望用户(admin)查看时区中的实际时间,以便他不需要计算。之后我随时都有一个cron作业,它看起来每分钟处理一个事件。

我有以下参数:

application.rb(我试过没有 - >标准UTC - >伦敦没问题,柏林错误时间)

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

mongoid.yml(尝试了所有组合,但需要use_activesupport_time_zone来获取int 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

我尝试更改事件#new中的Time.zone,以便在simple_form中描述时区的实际时间。它似乎工作,但然后控制器创建方法似乎再次将params视为标准时区并错误地转换它(在试验伦敦/柏林时+ -1小时)。我尝试了几乎所有参数组合以及Time.now/Time.zone.now。 在事件#index中,我切换time_zones以显示正确的时间。

稍微复杂一点:我在区域模型中保存时区,区域模型通过areaId与事件模型连接。

我如何在表格中向管理员显示他想要添加的区域(而不是他的时区)中的事件的正确时间,并将其正确保存在Mongo中,以便稍后通过cronjob触发它?

1 个答案:

答案 0 :(得分: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,则认为它不会被激活