何时在模型中使用“保存”与“保存!”?
Posted
技术标签:
【中文标题】何时在模型中使用“保存”与“保存!”?【英文标题】:When to use `save` vs `save!` in model? 【发布时间】:2011-02-20 10:16:21 【问题描述】:根据save bang your head, active record will drive you mad,我们应该避免在特殊情况下使用save!
和rescue
成语。鉴于此,假设模型需要@post.mark_rejected
。
如果mark_rejected
中的代码由于以下问题之一而失败,是否应该抛出异常? :
如果我们不抛出异常,那么:
控制器操作必须检查mark_rejected
的返回值并执行此操作
我们不希望该方法调用出现异常,因此我们不会在控制器操作中编写rescue
子句,因此异常会冒泡到 (..wherever..) 并且可能会显示为一些 ( 500 HTTP?)错误
示例代码:
def mark_rejected
...
save!
end
或
def mark_rejected
...
save
end
【问题讨论】:
@Zabba 这是source code and documentation ofsave
and save!
。
【参考方案1】:
save!
如果不成功会报错。
save
将返回布尔值,如 true 或 false。
【讨论】:
保存的相反命令是什么!我的意思是删除用户的命令是什么?user.delete
and user.remove
会删除用户
@ram 现在 activerecord 没有 remove?
方法。我不这么认为。
save
返回值 true
表示成功,false
表示失败,模型上的 .errors
将包含详细信息。【参考方案2】:
异常会产生更多开销,因此存在性能问题,尤其是在预计可能会经常抛出异常时,例如 save
。
检查返回值是否为假的代码行数比救援异常要少,所以我不明白如果你已经需要救援异常,那么检查返回值是个什么问题。在实践中,save!
抛出的异常多久会冒泡调用堆栈?根据我的经验,很少,如果有的话。
如果在调用 save
而不是 save!
时抛出异常,您应该希望它显示 500 错误页面,因为这就是发生的情况:不可恢复的、未知的、意外的内部服务器错误。
【讨论】:
感谢您今天的所有帮助。我现在已经阅读了一些关于异常的内容,并且得出的结论是,可以说异常不应该用于“流控制”。如果出现异常,我会让它在调用堆栈中冒泡,而是编写值检查代码来处理问题。目前,这种方法似乎是做这些事情的正确方法,尽管我不完全确定原因。哦,好吧。【参考方案3】:建议:在最后一行使用save
; save!
否则。
想法:如果方法返回保存的结果,您不应该抛出异常并让调用者处理保存问题,但如果保存隐藏在模型方法逻辑中,您可能希望以异常中止过程以防万一失败。
【讨论】:
以上是关于何时在模型中使用“保存”与“保存!”?的主要内容,如果未能解决你的问题,请参考以下文章
何时在 Tensorflow 模型保存中使用 .ckpt、.hdf5 和 .pb 文件扩展名?