首页 > 解决方案 > ActiveModel 脏到忽略毫秒

问题描述

在 Rails 中比较日期时间时,如何使 ActiveModel::Dirty 忽略毫秒。

     news.publish_at
     => Fri, 16 Nov 2018 17:05:37 CET +01:00

     news.publish_at = news.publish_at.to_s
     => "2018-11-16 17:05:37 +0100"

     news.publish_at_changed?
     => true

但是如果我在上面的日期时间中添加毫秒,改变了吗?是假的。

     news.publish_at = "2018-11-16 17:05:37.517 +0100"
     => "2018-11-16 17:05:37.517 +0100"

     news.publish_at_changed?
     => false

我正在使用 Rails 5.2.1

标签: ruby-on-railsrubyruby-on-rails-5

解决方案


我认为最简单的解决方法可能是向该模型添加一个自定义设置器,该设置器在每次分配新值时都会截断毫秒。

def publish_at=(value)
  if value
    time_without_usec = DateTime.parse(value).change(usec: 0)
    value = time_without_usec.to_s
  end

  super(value)
end

推荐阅读