【问题标题】:Why before_save considered to be bad?为什么 before_save 被认为是坏的?
【发布时间】:2016-09-02 13:47:18
【问题描述】:

很抱歉,如果已经问过类似的问题,我找不到任何相同的东西。

因此,有人能告诉我为什么before_save 尤其是有条件的可以被认为是坏的吗?

before_save :something, if: Proc.new { self.abc == 'hello' }

因此,我理解为什么验证有时更适合,但我不明白为什么有些人认为回调可能是一件不好的事情,他们强迫你只编写验证,但从不让它们有条件。

我个人认为可能存在更大的问题,因为此更改可能会影响已经存在的条目,因此如果您打算仅在某些情况下修改数据,则可以实施条件验证器或为before_save 提供if。为什么有些人觉得不好?有人可以帮我吗?

非常感谢!

【问题讨论】:

    标签: ruby-on-rails database validation activerecord callback


    【解决方案1】:

    我认为before_savebefore_validation的唯一缺点是没有被理解或正确使用

    • 只有在仔细考虑过此类回调实际上是要对所有记录全局使用时才应该使用它(还要考虑已经存储在数据库中的旧记录)
    • 如果回调仅适用于某些特定记录 或者条件,那么最好不要污染模型,只在模型外实现逻辑。
    • 如果回调正在改变状态,可能是记录或其他记录,那么这些回调的名称应该明确说明,并且开发人员应该知道并理解这些不应该有无意的影响。
    • 如果回调没有改变状态,那么它可以立即安全使用,因为它保证了不变性和幂等性。
    • 回调的顺序很重要,并且对正在发生的事情的有限理解可能会让开发人员/新开发人员编写带有无意影响的代码,并且可能不会一直有效。
    • before_savebefore_validation 是不同的,开发人员应该明白,有些回调是用作 before_save,有些则用作 before_validation

    除此之外,我认为before_save 没有任何问题,因为它可能会清理和分解代码的逻辑,并允许可重用​​性,尤其是在您有模型的子类时。

    只是我对此事的直接想法......

    【讨论】:

      【解决方案2】:

      使用回调是标准的 Rails 实践!如果使用得当,它们在维护数据完整性方面是很好的 DRY 帮手。回调被大量用于数据格式化用户输入(例如从手机号码字段中删除空格或破折号),其中通过验证返回错误只会让用户感到沮丧。使用验证来处理您无法预测的情况或无法预测的数据以及其他地方的回调(例如在保存之前对电子邮件进行小写)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-18
        相关资源
        最近更新 更多