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验证(例如
根据我的经验,您希望尽可能避免使用任何自定义保存或创建方法。如果你重新实现ActiveRecord中包含的功能,你最终会付出代价。http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist对此有更多的发言权。
什么!(bang)对于
"失败时引发异常"而不是"失败时返回错误"
https://api.rubyonrails.org/classes/activerecord/persistence.html method-i-update-21https://api.rubyonrails.org/classes/activerecord/persistence.html方法-i-save
什么!(bang)对于
"失败时引发异常"而不是"失败时返回结果对象"https://api.rubyonrails.org/classes/activerecord/persistence/classmethods.html method-i-create-21