何时使用save !,请创build! 和update_attributes! 在Rails中?

我试图找出什么时候使用砰! 保存和更新logging的版本? 我读过并且听说如果你只保存一条logging或更新一个属性,如果你确信没有什么问题,或者总是在控制器之外使用它们,你就不需要它们了。 我想我是多疑的事情得到保存,然后失败,然后有不完整的数据在数据库中。 目前我正在使用的Rails项目已经完成了超过50%,目前不包含任何爆炸声。 我有一些自定义的方法,我正在调用更新或创build多个logging的模型,并担心它们是否应该进行某种事务。

对不起,如果这似乎分散,但我只是想弄清楚如何正确使用ActiveRecord中的保存function,使我的生活更轻松,最终免费一点点。 谢谢你的时间。

一般来说,你想在你的控制器中使用非爆炸版本。 这允许这样的逻辑:

def update @model = Model.find params[:id] if @model.update_attributes params[:model] #returns true of false # handle success else # handle failure end end 

我发现自己在testing中使用了爆炸版本,当我想知道是否某些东西没有validation,并且没有保存。 我肯定是浪费了时间debugging由于改变了模型validation而失败的testing,如果我使用了爆炸版本,这将是显而易见的。

例如

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

就数据库中没有无效数据而言,您应该使用ActiveRecordvalidation(例如validates_presence_of :user_id )处理此问题,或者在模型中定义您自己的validate方法。 ( http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html )如果您的数据无效,这应该防止发生保存。 如果你真的偏执,你可以添加一些约束到你的数据库。 查看ActiveRecord::Migration文档,了解如何在ActiveRecord::Migration中设置唯一索引和其他数据库约束。

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

主要的区别是如何处理保存失败。 当更新一个ActiveRecord类! 如果logging无效,版本将引发exception。

我build议阅读这里的文档 – http://api.rubyonrails.org/classes/ActiveRecord/Base.html

使用交易也可能是值得研究的东西 – http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html