首页 文章

我什么时候使用save !,创建!和update_attributes!在Rails?

提问于
浏览
56

我想知道什么时候使用爆炸!用于保存和更新记录的版本?我已经阅读并听说如果您只是保存一条记录或更新单个属性,如果您确信没有任何错误,或者总是在控制器之外使用它们,则不需要它们 . 我想我很擅长有多个东西被保存然后出现问题然后数据库中的数据不完整 . 我正在开发的当前Rails项目已完成50%以上,目前不包含任何刘海 . 我有一些自定义方法,我在更新或创建多个记录的模型中调用,并担心它们是否应该在某种交易中 .

很抱歉,如果这看起来很分散,但我只是想弄清楚如何正确使用ActiveRecord中的保存功能,让我的生活更轻松,最后一点也没有压力 . 谢谢你的时间 .

2 回答

  • 69

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

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

    我发现自己在测试中经常使用爆炸版本,当我想确定我知道某些东西是否无法验证,并且没有保存 . 我肯定浪费时间调试由于模型验证改变而失败的测试,如果我使用爆炸版本,这将是显而易见的 .

    例如

    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 docs,了解如何在迁移中设置唯一索引和其他数据库约束 .

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

  • 51

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

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

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

相关问题