マルチテナント Rails アプリがあり、一部のモデルには日付フィールドがあります。レコードごとに異なるタイムゾーンを設定することは可能ですか? タイムゾーンと呼ばれるフィールドを追加してから行うようなことをします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 では、アプリケーション構成でアプリのタイム ゾーンを構成することもできます。
を呼び出して、現在の ruby プロセスが設定されているタイム ゾーンでTime.zone.now
現在の時刻を ( のインスタンスとして) 返すことができます。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
このメソッドを使用すると、モデルのタイム ゾーンと around フィルターを使用して、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
これらのアプローチのいずれかで、必要なものが得られるはずです。