レール側のソリューション
Rails(5.2)で使用されているActiveRecordは、created_at
を保存する際に、自動的に10進数の秒を1ミリ秒に追加するようです。 およびupdated_at
または、ファイルactive_record/connection_adapters/abstract/quoting.rb
で定義されているように、サブ秒を受け入れるDB内の他のタイムスタンプ列。
回避策はこれです。モデルにアクセスするときにRailsによって常に読み取られるファイル(ApplicationRecordモデルファイルなど)の最上位にこの行を追加します。
Time::DATE_FORMATS[:db] = '%Y-%m-%d %H:%M:%S.000000000'
module ActiveRecord::ConnectionAdapters::Quoting
alias_method :quoted_date_orig, :quoted_date if ! self.method_defined?(:quoted_date_orig)
def quoted_date(*rest, **kwd)
quoted = quoted_date_orig(*rest, **kwd)
quoted.sub(/(\.\d*)\.\d{6}$/, '\1')
end
end
新しいレコードを作成した後、Railsコンソールから確認できます。
MyModel.last.created_at.nsec # => 0
または、DBに直接アクセスして表示します。
警告
この変更は、created_at
だけでなく影響します およびupdated_at
DB内の他のすべてのタイムスタンプ列も同様です。 my_model.col_msec_desired = "2018-01-02 03:04:05.678"
;次にTime::DATE_FORMATS[:db]
レコードの保存では参照されません。
Laravel側の潜在的な解決策
執筆時点(2018-10-18)では注意が必要かもしれませんが、cmbertsch01による最近のLaracastの投稿
(注:コメントに続いて、元の投稿から翌日にメジャーアップデートが行われました。)