Ruby on Rails:updated_at - 在创建时设置为0

时间:2011-01-04 17:47:39

标签: ruby-on-rails activerecord

当我在query表上创建新记录时,我希望updated_at(时间戳)为'0000-00-00 00:00:00' - 而不是当前时间戳,如Ruby on Rails默认设置。

MySQL字段:

`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP

然而,Ruby on Rails生成了这个SQL查询:

INSERT INTO `queries` (`updated_at`) VALUES ('2011-01-04 17:40:15')

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:8)

Rails将updated_at设置为当前时间,因为当记录最近更新时就是这样。它将更新视为创建。如果您想检查某些内容是否曾经更新,请检查其updated_atcreated_at是否相同。

否则,您应该能够通过在插入时强制属性来更改插入的值。

Post.new(@params.merge({:updated_at => DateTime::new})

或者,在模型的before_create方法中,设置self.updated_at = DateTime::new

答案 1 :(得分:1)

如果您希望Rails跳过记录时间戳,可以使用此API:

ActiveRecord::Base.record_timestamps = false
# This also works on individual models
Post.record_timestamps = false

由于RailsActiveRecord更合适)不会为此字段指定值,因此您的数据库会将默认值分配给这些字段。

答案 2 :(得分:0)

我最近发现了this blog post on the subject

总而言之,他描述了(使用示例)使用这些时间戳列覆盖ActiveRecord的默认行为的方法。他解释说ActiveRecord实际上忽略了提供的updated_at信息,并且总是使用自己的时间戳。

最终,他使用补丁ActiveRecord来提供一种新的update_without_timestamping方法,该方法可以禁用和重新启用时间戳它的线程安全,并且仅修改模型的行为工作。

如果你不想阅读这篇文章,他最后的猴子修补代码如下:

module ActiveRecord
  class Base

    def update_record_without_timestamping
      class << self
        def record_timestamps; false; end
      end

      save!

      class << self
        remove_method :record_timestamps
      end
    end

  end
end