0

我还是 Ruby on Rails 的新手,在我的模型中我经常这样做:

def activate
  update_column(:activated, true)
  update_column(:activated_at, Time.zone.now)    
  update_column(:activation_token, nil)
end

如果我改为这样做有什么不同?

def activate
  self.activated = true
  self.activated_at = Time.zone.now
  self.activation_token = nil
  save!(:validate => false)  
end

我仍然不明白这两种方法之间的区别。从数据库的角度来看,哪一个更快或更高效?

4

2 回答 2

1

当您一调用update_column就调用时,会生成一个查询并在数据库上执行。所以你最终得到了三个更新查询。

但是,当您object使用第二种方法更改 的属性,然后最后调用save时,将生成并执行单个查询以对object(表示记录)进行所有更改。

因此,就效率而言,您应该始终使用第二个。请记住,数据库上的写入或查询次数越少越好!

于 2013-10-25T11:40:31.110 回答
1

更新列:

更新对象的单个属性,而不调用 save。

  • 验证被跳过。
  • 回调被跳过。
  • 如果该列可用,updated_at/updated_on 列不会更新。
  • 将为每个 update_column 调用触发 1 个查询。

然而

节省 :

  • 将执行验证、回调、更新 updated_at 列并触发单个查询。

对于您的情况,第二个选项绝对是更好的选择,是的,您应该删除:validate => false表单保存以避免任何验证问题。

于 2013-10-25T12:02:25.843 回答