我有一个多租户rails应用程序,有些模型有一个日期字段。是否可以为每条记录设置不同的时区。我会做一些像添加一个名为时区的字段,然后做Date.somemethodthatsetstimezone(timezone).now()
吗?对不起,如果这是一个糟糕的问题。
答案 0 :(得分:2)
对你的问题的简短回答是肯定的 - 但要确保你知道你在做什么。
您需要查看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
其中一种方法可以满足您的需求。