何时在模型中使用“保存”与“保存!”?

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 of save 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】:

建议:在最后一行使用savesave! 否则。

想法:如果方法返回保存的结果,您不应该抛出异常并让调用者处理保存问题,但如果保存隐藏在模型方法逻辑中,您可能希望以异常中止过程以防万一失败。

【讨论】:

以上是关于何时在模型中使用“保存”与“保存!”?的主要内容,如果未能解决你的问题,请参考以下文章

何时在 Tensorflow 模型保存中使用 .ckpt、.hdf5 和 .pb 文件扩展名?

何时在 save() 之前使用 merge()?

如何知道文本字段何时更改而不保存

何时在快速会话中使用 saveUninitialized 和重新保存

何时在 iPhone 开发中使用 CoreData

最佳核心数据保存策略(何时将数据保存到磁盘)