关于activerecord:我何时使用save !,创建!

When do I use save!, create! and update_attributes! in Rails?

我想知道什么时候用爆炸!用于保存和更新记录的版本?我听说,如果您只保存一个记录或更新一个属性,如果您确信没有任何错误,或者总是在控制器之外使用它们,那么您不需要它们。我想我偏执于多个东西被保存,然后一些东西失败了,那么数据库中就有不完整的数据。我目前正在做的Rails项目已经完成了50%以上,目前还没有包含任何刘海。我在模型中调用了一些自定义方法,这些方法可以更新或创建多个记录,并担心它们是否应该出现在某种事务中。

抱歉,如果这看起来有些零散,但我只是想知道如何正确地使用ActiveRecord中的保存功能,并最终使我的生活更轻松、更轻松。谢谢你的时间。


主要区别在于如何处理失败的保存。更新ActiveRecord类时,如果记录无效,!版本将引发异常。

我建议在这里阅读文档-http://api.rubyonrails.org/classes/activerecord/base.html

使用事务也可能是值得研究的东西-http://api.rubyonrails.org/classes/activerecord/transactions/classmethods.html


通常,您希望在控制器中使用非爆炸版本。这就允许这样的逻辑:

1
2
3
4
5
6
7
8
def update
  @model = Model.find params[:id]
  if @model.update_attributes params[:model] #returns true of false
     # handle success
  else
     # handle failure
  end
end

我发现自己在测试中经常使用bang版本,当我想确保我知道某些东西是否不能被验证,并且没有被保存时。我确实浪费了大量的时间来调试由于模型验证的改变而失败的测试,如果我使用bang版本的话,这是显而易见的。

例如

1
2
3
4
it"should do something" do
   m = Model.create! :foo => 'bar' # will raise an error on validation failure            
   m.should do_something
end

对于数据库中没有无效数据的情况,您应该使用ActiveRecord验证(例如validates_presence_of :user_id或在模型中定义自己的validate方法来处理此问题。(http://api.rubyonrails.org/classes/activerecord/validations/classmethods.html)如果您的数据无效,这应该可以防止保存。如果你真的是偏执狂,你可以给你的数据库添加一些约束。检查ActiveRecord::Migration文档,了解如何在迁移中设置唯一索引和其他数据库约束。

根据我的经验,您希望尽可能避免使用任何自定义保存或创建方法。如果你重新实现ActiveRecord中包含的功能,你最终会付出代价。http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist对此有更多的发言权。


什么!(bang)对于update_attributessave的意思是:

"失败时引发异常"而不是"失败时返回错误"

https://api.rubyonrails.org/classes/activerecord/persistence.html method-i-update-21https://api.rubyonrails.org/classes/activerecord/persistence.html方法-i-save

什么!(bang)对于create的意思是:

"失败时引发异常"而不是"失败时返回结果对象"https://api.rubyonrails.org/classes/activerecord/persistence/classmethods.html method-i-create-21