Giải pháp ở phía Rails
Có vẻ như ActiveRecord được sử dụng trong Rails (5.2) tự động thêm giây thập phân xuống 1 mili giây khi lưu created_at
và updated_at
hoặc bất kỳ cột Dấu thời gian nào khác trong DB chấp nhận giây con, như được định nghĩa trong tệp active_record/connection_adapters/abstract/quoting.rb
Một công việc xung quanh là điều này. Thêm dòng này ở cấp cao nhất trong bất kỳ tệp nào sẽ luôn được Rails đọc khi truy cập vào một mô hình (chẳng hạn như tệp mô hình 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
Bạn có thể xác nhận nó từ bảng điều khiển Rails, sau khi tạo một bản ghi mới,
MyModel.last.created_at.nsec # => 0
hoặc chỉ cần truy cập trực tiếp vào DB để xem nó.
Cảnh báo
Thay đổi này không chỉ ảnh hưởng đến created_at
và updated_at
mà còn tất cả các cột dấu thời gian khác trong DB. Tôi nghĩ rằng bạn vẫn có thể lưu giá trị thành msec (hoặc nsec) chính xác cho một cột như vậy bằng cách đặt một Chuỗi trái ngược với phiên bản Thời gian cho cá thể Mô hình của bạn như my_model.col_msec_desired = "2018-01-02 03:04:05.678"
; rồi đến Time::DATE_FORMATS[:db]
sẽ không được tham chiếu khi lưu bản ghi.
Giải pháp tiềm năng ở phía Laravel
Có thể hơi phức tạp vào thời điểm viết bài (2018-10-18), nhưng có vẻ như một công việc đang được tiến hành, theo bài đăng rất gần đây về Laracast của cmbertsch01
(Lưu ý:một bản cập nhật lớn được thực hiện một ngày sau bài đăng gốc, sau nhận xét.)