【问题标题】:my_object.save(false) doesn't REALLY skip my Active Record validationsmy_object.save(false) 并没有真正跳过我的 Active Record 验证
【发布时间】:2009-03-29 22:39:26
【问题描述】:

所以我一直在努力解决我遇到的这个错误,我终于找到了导致它的原因。我一直有这样的印象,当我打电话时

@my_model.save(false)

我会跳过我的 ActiveRecord 验证。事实证明这是部分正确的。我的对象正在保存到数据库 尽管 我的 ActiveRecord 验证。我的问题存在是因为我的一个验证在验证过程中修改了其中一个子模型(这是一个 24 小时位置的调度应用程序,因此当午餐被保存时,我会根据他们保存的日期和第二天检查它们还要确保用户不是指“凌晨 2 点”来过夜。

我的问题是:有没有办法真正跳过我的验证并直接进入数据库?这是正常的 ActiveRecord 行为还是我应该更深入地进行验证?还是我运气不好,需要重新编写验证?

【问题讨论】:

  • 所以您说验证代码仍在运行,只是忽略了它们的结果,这是一个问题,因为您在验证中修改了模型。我会使用验证以外的方法来清理数据。
  • 就是这样!我猜这是我的最终答案,但我想我会试试运气,看看能不能找到另一个。
  • 使用验证来后处理您的业务对象绝对是一种味道。验证旨在检查数据,而不是修改数据。要修改,请改用各种 ActiveRecord 生命周期钩子:before/after-save、before/after-create 等。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我的问题存在是因为我的一个验证在验证过程中修改了一个子模型

解决这个问题,您的问题就会消失。验证不应该修改对象!

【讨论】:

    【解决方案2】:

    您可能希望在将记录保存到数据库之前使用 before_create 或其他回调与记录进行交互,而不是尝试在验证器内部执行此操作。

    这里是关于 ActiveRecord 回调的文档: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

    还有一个使用回调的指南,其中包含有关如何在此处跳过它们的一些详细信息: http://guides.rubyonrails.org/activerecord_validations_callbacks.html

    【讨论】:

      【解决方案3】:

      我同意,您应该使用回调与记录进行交互。验证不应该修改对象..

      如果你仍然觉得需要这样做.. 使用

      myobject.save_without_validation

      【讨论】:

        【解决方案4】:

        我同意 Orion,永远不要使用验证来修改对象,而是使用像 after_save 这样的回调。

        【讨论】:

        • 无论谁对此投了反对票,您都需要重新考虑一些事情。验证是为了验证。如果您不同意,请发表评论,我们可以看到您的理论是什么。
        猜你喜欢
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 2014-03-24
        • 1970-01-01
        • 2014-12-26
        • 2012-04-06
        • 1970-01-01
        • 2017-03-24
        相关资源
        最近更新 更多