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_at
和created_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
由于Rails
( ActiveRecord
更合适)不会为此字段分配值,因此您的数据库将为这些字段分配默认值。
我最近发现了关于这个主题的博文 。
总而言之,他描述了(使用示例)使用这些时间戳列覆盖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