レコードをMySqlからPostgresに移行するときに、Railsでクエリのデフォルトのタイムゾーンを設定する方法、または日時値のオフセットを設定する方法

user1322092

モデルフォルダにrubyクラスを作成して、デフォルト列にPacific / PT使用するレガシーMySQLデータベースに接続しましたdatetime

ただし、railsはdatetime、レガシーデータベースレコードの値をPT / PacificではなくUTCとして扱いますPostgresのタイムスタンプ(railsの場合)は(したがって、値はUTCである必要がある)ため、この値をPostgresに挿入することは正しくありません。timestamp without time zone

1)default_timezone接続を太平洋に設定するか、2)値をUTCに正しく変換するある種のオフセットを作成するにはどうすればよいですか?後者の場合、オフセットには夏時間のニュアンスをどのように組み込むのでしょうか。

これが私が問題を確認した方法です:

[6] pry(LegacyClient)> @legacy.ClientRecordAddDate.to_yaml
=> "--- 2010-04-11 14:23:01.000000000 Z\n...\n"
[7] pry(LegacyClient)> @legacy.ClientRecordAddDate
=> Sun, 11 Apr 2010 07:23:01 PDT -07:00
[8] pry(LegacyClient)> self.default_timezone
=> :utc
user1322092

私はこの問題で数日苦労した後、これを解決しました。それはやや微妙なハックです。default_timezoneレール内は、:localまたはのいずれかになります:utcしたがって、railsが太平洋ベースのMysqlレコードを「utc」またはUTCから-7時間遅れて誤って解釈したため、UTCに戻し(元々誤って解釈されていたため、実際には「Pacific」に戻し)、値を文字列に変換する必要がありました。 。次に、ActiveRecordは文字列をPacificに変換し(application.rbにあるのでconfig.time_zone = 'Pacific Time (US & Canada)')、正しいUTC形式でPostgresに保存します。

[2] pry(LegacyClient)> @legacy.ClientRecordAddDate.utc.to_s
=> "2010-04-11 14:23:01"

従来のmysql値をキャプチャするハッシュには、以下のcreated_atとが含まれupdated_atます。

{
...
created_at: @legacy.ClientRecordAddDate.utc.to_s,
updated_at: @legacy.ClientRecordUpdateDate.utc.to_s
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ