使用活动记录查找跨时区的记录

时间:2014-05-17 17:40:30

标签: ruby-on-rails activerecord timezone

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

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

我认为将时间戳作为utc存储为时区的单独列是可行的方法,但我不确定如何查询数据库以在特定时间返回所有预定的电子邮件必须按时区执行一个查询。

1 个答案:

答案 0 :(得分:0)

是的,以UTC格式存储数据 - rails默认情况下会执行此操作;在您的用户模型上添加time_zone

以下是我为rails中的时区撰写的帖子,您可能会觉得有用: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

相关问题