何时在 Rails 中使用 save! 、 create! 和 update_properties! ?

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

对不起,如果这看起来分散,但我只是试图弄清楚如何正确使用 ActiveRecord 的保存功能,使我的生活更容易,最后多一点压力释放。谢谢你抽出时间。

64817 次浏览

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

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

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

一般来说,你需要在你的控制器中使用非 bang 版本,这允许这样的逻辑:

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 版本,这一点就显而易见了。

例如:。

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

对于 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

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

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