多租户App时区轨道

时间:2013-04-04 04:19:03

标签: ruby-on-rails date timezone

我有一个多租户rails应用程序,有些模型有一个日期字段。是否可以为每条记录设置不同的时区。我会做一些像添加一个名为时区的字段,然后做Date.somemethodthatsetstimezone(timezone).now()吗?对不起,如果这是一个糟糕的问题。

1 个答案:

答案 0 :(得分:2)

对你的问题的简短回答是肯定的 - 但要确保你知道你在做什么。

您需要查看ActiveSupport::TimeZoneActiveSupport::TimeWithZone。 ActiveSupport :: TimeZone提供时区作为值对象访问为字符串。例如,您可以将字符串'Eastern Time (US & Canada)'存储在模型的time_zone列中(假设为@project),然后使用ActiveSupport::TimeZone[@project.time_zone]检索时区实例。

您可以使用Time.zone = 'Eastern Time (US & Canada)'之类的内容设置当前流程的时区。 Rails还允许您在应用程序配置中配置应用程序的时区。

您可以调用Time.zone.now在当前ruby进程设置的时区中返回当前时间(作为ActiveSupport::TimeWithZone的实例)。

您可以致电Time.now.in_time_zone('Eastern Time (US & Canada)')获取指定时区的当前时间。

您甚至可以为代码块设置时区:

Time.use_zone('Eastern Time (US & Canada)') do
  # do stuff in eastern time

  Time.now 
  # => current eastern time 
end

此方法允许您使用模型中的时区和周围过滤器设置整个rails请求的时区:

around_filter :project_time_zone

# actions use project's configured time zone

private

def project_time_zone(&block)
  Time.use_zone(@project.time_zone, &block)
end

其中一种方法可以满足您的需求。