【问题标题】:update a column without changing updated_at更新列而不更改 updated_at
【发布时间】:2015-05-21 14:20:42
【问题描述】:

这听起来像是一个奇怪的请求,但是,我正在使用印象派,并使用缓存的命中列。每当它受到打击时,我也会更新另一列,这是一个单独的计算。

我现在不想更新 updated_at,有没有办法跳过它?

if impressionist(@topic, "message...", :unique => [:session_hash])
  @topic.increment(:exp, 1).save
end

谢谢

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

ActiveRecord::Persistence 中的 update_columns 方法可以满足您的需求。

【讨论】:

  • 谢谢!使用increment 方法时可以这样做吗?还是我只需要手动增加(+1)?
  • 谢谢,我知道了:@topic.update_columns(exp:@topic.increment(:exp, 1).exp)
【解决方案2】:

除了禁用整个类的时间戳(这不是线程安全的)之外,您还可以禁用单个实例的时间戳:

@topic.record_timestamps = false
@topic.increment(:exp, 1).save

在重新启用时间戳之前,此实例不会创建或更新时间戳。这只会影响这个特定的实例,其他实例(即使它们引用数据库中的同一行)不受影响。

【讨论】:

  • 我得到一个未定义的方法
  • @topic.record_timestamps = false @topic.increment(:exp, 1).save
【解决方案3】:

increment之前禁用record_timestamps

ActiveRecord::Base.record_timestamps = false

@topic.increment(:exp, 1).save

ActiveRecord::Base.record_timestamps = true

Is there a way to avoid automatically updating Rails timestamp fields?

线程安全版本:update dataset without updating magic timestamp columns

【讨论】:

  • 看起来不是线程安全的,但也许 AR 在内部使用线程局部变量?
  • 它改变了ActiveRecord::Base上的一个全局属性,所以它会影响所有正在运行的线程,而不仅仅是当前线程。
  • 这里是线程安全的版本:ck.kennt-wayne.de/2013/oct/…
  • 哈!很好的发现。不过,这似乎可能会从未来的 Rails 更新中中断。
  • @ShalevShalit 您应该考虑正在执行的代码可能会引发错误的可能性,因此您应该使用确保块(根据您的答案中的链接)。
【解决方案4】:

从 Rails 5 开始,您可以将 touch 参数传递给 save 方法以避免更新 updated_at 列:

user.name = "New Name"
user.save(touch: false) # doesn't update updated_at

【讨论】:

    猜你喜欢
    • 2019-06-11
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多