【问题标题】:Why doesn't update_attribute change my timestamp column为什么 update_attribute 不更改我的时间戳列
【发布时间】:2013-02-05 22:11:35
【问题描述】:

我有一个带有时间戳列的模型 queued_at。

为什么update_attribute(:queued_at, Time.now) 不写入数据库?这只是偶尔发生。这是一个经常更新的属性。 update_column 似乎一直有效。

我正在使用带有 postgres 的 rails 3.2.12。

rails 3.1.11 中不存在此问题。

这些项目展示了“问题”:

  1. https://github.com/johnnaegle/scratch/tree/feature/rails_3.2.12
  2. https://github.com/johnnaegle/scratch/tree/feature/rails_3.1.11

【问题讨论】:

  • 如果您遇到这种情况,这是 rails 中的一个错误,该错误将在下一个(3.2.12 之后)非安全版本中修复。

标签: ruby-on-rails-3 postgresql activerecord ruby-on-rails-3.2


【解决方案1】:

似乎 active_record 足够聪明,可以知道正在更新的值是否相同或足够接近(在时间戳的情况下),它将避免 SQL 写入 - 节省性能。我已经成功地通过在 update_attribute 调用之后“触摸”相关对象的模型来强制写入 updated_at 字段

foo.update_attribute :last_status, status
foo.touch
## log entry
##  UPDATE `foo` SET `updated_at` = '2013-07-25 19:56:36' WHERE `foo`.`id` = 55

【讨论】:

  • 您也可以使用 update_column 来强制写入,而不管模型认为什么是脏的。这不会改变 updated_at 作为副作用。
【解决方案2】:

似乎update_attribute 仅在当前时间和您尝试设置的新时间相差至少一秒时才会看到变化。我在 activerecord 代码中找不到发生这种情况的位置,但这说明了问题。我创建了两次,每次 100 毫秒,第一次更新记录,但第二次更新没有提交到数据库。

[15] pry(main)> x=Time.now;sleep(0.1);y=Time.now
=> 2013-02-20 12:06:57 -0600

[16] pry(main)> x.strftime("%Y-%m-%d %H:%M:%S.%L")
=> "2013-02-20 12:06:57.185"

[17] pry(main)> y.strftime("%Y-%m-%d %H:%M:%S.%L")
=> "2013-02-20 12:06:57.286"

[18] pry(main)> kat = Kitten.first
  Kitten Load (1.2ms)  SELECT "kittens".* FROM "kittens" LIMIT 1
=> #<Kitten id: 1,  queued_at: "2013-02-13 20:38:00">

[19] pry(main)> kat.queued_at = x
=> 2013-02-20 12:06:57 -0600

[20] pry(main)> kat.save
   (0.5ms)  BEGIN
   (0.6ms)  UPDATE "kittens" SET "queued_at" = '2013-02-20 18:06:57.185870' WHERE "kittens"."id" = 1
   (1.3ms)  COMMIT
=> true

[21] pry(main)> kat.queued_at = y
=> 2013-02-20 12:06:57 -0600

[22] pry(main)> kat.save
   (0.2ms)  BEGIN
   (0.2ms)  COMMIT
=> true

【讨论】:

  • 我很想知道 ActiveRecord 为何以及在何处决定第二次更新不更改对象。
  • FWIW,此测试不适用于我的 rails 3.1.11 项目。第二次保存确实写入数据库。
  • 我开始了一个干净的 rails 3.1.11 项目,第二次保存确实写了。将其升级到 3.2.12 后,它没有提交。哇!骑在铁轨上。
  • PG 适配器问题可能吗? 3.1 和 3.2 上的适配器有哪些版本?
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多