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

时间:2009-11-19 05:27:23

标签: ruby-on-rails activerecord transactions

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

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

3 个答案:

答案 0 :(得分:71)

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

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

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

答案 1 :(得分:51)

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

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

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

e.g。

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对此有更多话要说。

答案 2 :(得分:1)

什么! (bang)表示update_attributessave的意思是:

“失败时引发异常”,而不是“失败时返回假”

https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update-21 https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save

什么! (bang)表示create的意思是:

“失败时引发异常”,而不是“失败时返回结果对象” https://api.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html#method-i-create-21