PostgreSQL支持多个"Special Date/Time Inputs"字符串,它们在执行时会解释。例如,'now'
表示“当前交易的开始时间”,'infinity'
表示“晚于所有其他时间戳”。
ActiveRecord似乎不理解这些 - 例如,SomeRecord.update!(updated_at: DateTime.current)
有效,但SomeRecord.update!(updated_at: 'now')
尝试使用UPDATE
执行NULL
查询。
这些特殊字符串在Rails灯具中起作用,因为它们直接进入数据库。但有没有办法将它们与实例化模型一起使用?
答案 0 :(得分:1)
您可以使用raw_write_attribute(:updated_at,'now')设置值
答案 1 :(得分:0)
.update_column
例如,some_record.update_column(:updated_at, 'now')
。
警告 - 此bypasses validations, callbacks, and normal setting of timestamps;它只是立即发出UPDATE
个查询。
尽管如此,ActiveRecord撰稿人Sean Griffin said" update_column
可能是最好的' hacky'回答"而像这样的特殊字符串值并没有得到很好的支持,也许不应该。 (我认为我同意 - 无论是ActiveRecord还是你自己的模型,它都会让验证变得非常尴尬。)
鉴于这是一个"直接到数据库"方法,避免跳过验证和回调的一种可能的妥协方案是:
ActiveRecord::Base.transaction do
record.updated_at = Time.current # temporary value
record.save! # with validations, etc
record.update_column(:updated_at, 'now') # final value
end
我注意到在控制台中执行此操作时还有其他一些注意事项:
created_at
的值。只有在做some_record.reload
后才能看到时间戳。rails console
会话使用一个交易。如果我开始使用新的控制台,我会为'现在'