Řešení na straně Rails
Zdá se, že ActiveRecord použitý v Rails (5.2) automaticky přidává desetinné sekundy až na 1 msec při ukládání created_at
a updated_at
nebo jakékoli jiné sloupce Timestamp v DB, které přijímají subsekundy, jak je definováno v souboru active_record/connection_adapters/abstract/quoting.rb
Práce kolem je toto. Přidejte tento řádek na nejvyšší úroveň do libovolného souboru, který by Rails vždy četl při přístupu k modelu (jako je soubor modelu 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
Můžete to potvrdit z konzole Rails po vytvoření nového záznamu
MyModel.last.created_at.nsec # => 0
nebo jednoduše přistupte přímo k DB a uvidíte ji.
Upozornění
Tato změna se netýká pouze created_at
a updated_at
ale také všechny ostatní sloupce časových razítek v DB. Myslím, že do takového sloupce můžete stále uložit hodnotu s přesností msec (nebo nsec) nastavením řetězce na rozdíl od instance času do instance vašeho modelu, jako je my_model.col_msec_desired = "2018-01-02 03:04:05.678"
; pak Time::DATE_FORMATS[:db]
nebude odkazováno při ukládání záznamu.
Potenciální řešení na straně Laravel
V době psaní tohoto článku (2018-10-18) to může být složité, ale podle nejnovější příspěvek Laracast od cmbertsch01
(Poznámka:hlavní aktualizace provedená den poté od původního příspěvku po komentáři.)