如果新属性与现有属性相同,Active Record是否继续"保存"?

hof*_*ffm 2 activerecord ruby-on-rails

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

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

(如果我在这里误用了一些术语,我很抱歉.我是游戏的新手.)

apn*_*ing 6

没有进行db查询,这是一个在控制台中使用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
Run Code Online (Sandbox Code Playgroud)

编辑:

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.
Run Code Online (Sandbox Code Playgroud)

所以它更快if changed?.