モデルフォルダに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
私はこの問題で数日苦労した後、これを解決しました。それはやや微妙なハックです。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]
コメントを追加