【问题标题】: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

【问题讨论】:

标签: ruby-on-rails-3


【解决方案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! 否则。

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

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2012-03-16
    • 2021-03-17
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多