Rails:为具有特定时间值的用户查询数据库,同时尊重个人用户时区设置

时间:2016-07-25 18:56:34

标签: ruby-on-rails ruby postgresql datetime

我有一个每15分钟运行一次的后台工作并生成提醒电子邮件。我想创建一个查询,返回所有已保存特定时间的用户,并尊重他们的时区设置如何影响该时间。

所以我有一个$x模型存储:

  • User:用户提醒时间,例如:time
  • 17:00:00:他们的时区,例如:string

因此,如果作业在EST EST运行,它将返回其设置为:

的用户
  • 17:00:00reminder_time: 17:00:00
  • time_zone: ESTreminder_time: 13:00:00

构建该查询的最佳方法是什么?可以一次性完成,依靠Postgres来处理工作吗?我是否必须错开它,按每个时区分组并为Ruby中的每个时区进行数学运算?

我目前将此设置作为time_zone: PST范围,不考虑时区,我现在尝试添加该注意事项。

ActiveRecord

3 个答案:

答案 0 :(得分:1)

在处理多个时区的用户时,通常最简单的标准化UTC。

因此,以UTC格式存储reminder_time,这样您在查询时就不必担心TZ,因为它们都会被标准化为UTC。 (假设您正在运行服务器UTC。它将按预期工作)。然后你只需使用他们的TZ偏移量来调整观看时间。

答案 1 :(得分:0)

您可以在用户模型上使用选择。类似的东西:

long

您应该替换“time_the_job_runs”。它对我来说并不清楚如何获得它。但User.select{|user| user.time == time_the_job_runs.in_time_zone(user.string)} 方法应该是您要根据时区字符串转换时间的方法。希望它有所帮助,谢谢!

答案 2 :(得分:0)

刚遇到同样的问题。并找到了如何制作它的文章,以及如何思考自己解决它。但准备好代码。 https://robots.thoughtbot.com/a-case-study-in-multiple-time-zones

主要思想是:

  1. 首先,您会找到具有特定时间的时区。

    module ActiveSupport
      class TimeZone
        def self.current_zones(hour)
          all.select { |zone|
            t = Time.current.in_time_zone(zone)
            t.hour == hour
          }.map(&:tzinfo).map(&:name)
        end
      end
    end
    
  2. 您找到具有此时区的用户。

    User.where(zone: ActiveSupport::TimeZone.current_zones(hour)).where(options)