2014-05-17 55 views
1

我正在开发一个应用程序,用户可以请求在他们的时区每天的特定时间向他们发送电子邮件。 例如用户A住在伦敦,每天伦敦时间下午2点安排电子邮件,用户B住在纽约,并在纽约时间下午2点安排电子邮件。使用活动记录跨时区查找记录

我想知道如何将我的日程表时间戳存储在我的数据库中,以及我需要保存哪些支持信息以支持所有时间都取决于特定时区的事实。

我在考虑将时间戳记存储为时区的单独列的utc是要走的路,但我不确定如何查询数据库以在特定时间返回所有计划的电子邮件而无需执行每个时区一个查询。

回答

0

是的,将数据存储在UTC - 导轨默认会这样做;把time_zone列在您的用户模型

下面是一个职位,我在轨道的时区中写道,你可能会发现有用:http://jessehouse.com/blog/2013/11/15/working-with-timezones-and-ruby-on-rails/

,如果你有一个后台作业运行,这可能是过于复杂,但我想(delayed_job的,sidekiq等),它会检查每个时区/电子邮件时间表 - 这样的事情(?你一定要在你的用户的time_zone,也许上了日程以及)

# loop through all timezones 
ActiveSupport::TimeZone.zones_map(&:name).each do |time_zone| 
    # get a list of any saved schedules in this timezone 
    scheduled_in_zone = EmailSchedule.where(time_zone: time_zone) 

    # execute block in that timezone 
    Time.use_zone(time_zone) do 
    # Time.current is timezone aware (same as Time.zone.now) 
    now = Time.current 

    scheduled_in_zone.each do |scheduled| 
     if scheduled.deliver_at <= now 
     scheduled.deliver_it!   
     end 
    end 
    end 
end 

我也建议检查出:http://railscasts.com/episodes/106-time-zones-revised

+0

感谢您的回答。我不知道use_zone块,这真的很方便!我想避免的一件事就是不得不运行多个查询。随着桌子尺寸的增大,这会变得非常痛苦。我希望能够运行一个查询,要求所有所有的电子邮件在这个时候发送,并且它会在所有时区奇迹般地计算出来。我认为可能没有办法通过活动记录来实现这一点,但是我可能不得不放弃使用postgres中的时区支持,并尝试在那里完成。 – KJF

+0

您也可以在每个时区有1个后台作业,并同时运行它们;如果您在轨道中保持时区处理,则无需担心日光节省补偿 – house9