我有一个多租户 Rails 应用程序,一些模型有一个日期字段。是否可以为每条记录设置不同的时区。我会做一些事情,比如添加一个名为 time zone 的字段然后做Date.somemethodthatsetstimezone(timezone).now()
吗?对不起,如果这是一个不好的问题。
1 回答
您的问题的简短回答是肯定的 - 但请确保您知道自己在做什么。
你会想看看ActiveSupport::TimeZone和ActiveSupport::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
其中一种方法应该可以满足您的需求。