当我在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')
我该如何解决这个问题?
答案 0 :(得分:8)
Rails将updated_at
设置为当前时间,因为当记录最近更新时就是这样。它将更新视为创建。如果您想检查某些内容是否曾经更新,请检查其updated_at
和created_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
由于Rails
(ActiveRecord
更合适)不会为此字段指定值,因此您的数据库会将默认值分配给这些字段。
答案 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