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

当我在query表上创建新记录时,我希望updated_at (timestamp)为’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') 

我该如何解决?

Rails将updated_at设置为当前时间,因为这是最近更新记录时的那些。 它将更新视为创建。 如果要检查某些内容是否已更新,请检查其updated_atcreated_at是否相同。

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

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

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

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

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

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

我最近发现了关于这个主题的博文 。

总而言之,他描述了(使用示例)使用这些时间戳列覆盖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