gpt4 book ai didi

ruby-on-rails - 如果新属性与现有属性相同,Active Record 是否继续使用 'save'?

转载 作者:行者123 更新时间:2023-12-04 06:20:13 26 4
gpt4 key购买 nike

我编写了一个任务,该任务将定期运行以重新计算和更新 Active Record 模型特定列中的信息。通常,新计算的对象(它是一个 json 编码的散列,如果重要的话)将与现有对象相同。在这种情况下,我怀疑检查此身份并中止保存而不是保存可能更有效。因此,我正在考虑使用 self.save!如果更改? 而不仅仅是 self.save!。我的问题是:

  1. Active Record 是否自动执行此操作,以便这两个命令实际上是等价的?
  2. 如果像我怀疑的那样,它没有,我是否可以通过添加 if changed? 条件来节省 CPU 时间?

(如果我在这里误用了一些术语,我深表歉意。我是这个游戏的新手。)

最佳答案

没有进行数据库查询,这是一个在控制台中使用 Rails 3.1.1 的简​​单示例:

> s = Shop.first   
=> #<Shop id: 1, name: "Ben", address: "paris", latitude:
> 48.856614, longitude: 2.3522219, gmaps: true, created_at: "2011-10-13 13:17:24", updated_at: "2011-10-13 13:17:24"> ruby-1.9.2-p290 :003 >

> s.name = "Ben" => "Ben"
> s.save
=> true
> s.updated_at
=> Thu, 13 Oct 2011 13:17:24 UTC +00:00

> s.update_attribute(:name, "Ben")
=> true
> s.updated_at
=> Thu, 13 Oct 2011 13:17:24 UTC +00:00

> s.update_attributes({:name => "Ben"})
=> true
> s.updated_at
=> Thu, 13 Oct 2011 13:17:24 UTC +00:00

> s.name = "Ben"
=> "Ben"
> s.save!
> s.updated_at
=> Thu, 13 Oct 2011 13:17:24 UTC +00:00

编辑:

rails profiler 's = Shop.first; s.name = "Ben"; s.save;' 's = Shop.first; s.name =     
Loaded suite script/rails
Started
ProfilerTest#test_s_shop_first_s_name_ben_s_save (78 ms warmup)
process_time: 5 ms
ProfilerTest#test_s_shop_first_s_name_ben_s_save_if_s_changed (1 ms warmup)
process_time: 2 ms
Finished in 2.597531 seconds.

所以 if changed? 会更快。

关于ruby-on-rails - 如果新属性与现有属性相同,Active Record 是否继续使用 'save'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7756628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com