保存ActiveRecord模型实例的最佳方法是什么?

时间:2013-10-25 11:31:24

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

我还是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

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

2 个答案:

答案 0 :(得分:1)

调用后立即调用update_column,将在数据库上生成并执行查询。所以你最终会得到三个更新查询。

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

因此,就效率而言,你应该总是选择第二个。记住,数据库上的写入或查询次数越少越好!

答案 1 :(得分:1)

update_column:

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

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

其中

保存:

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

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