为什么before_save被认为是坏的?

时间:2016-09-02 13:47:19

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

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

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

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

因此,我理解为什么验证有时会更好,但是我不明白的是为什么有些人认为回调可能是一件坏事,它们迫使你只编写验证但从不使它们成为条件。< / p>

我个人认为可能存在更大问题,因为此更改可能会影响现有条目,因此如果您计划仅修改数据,则可以实现条件验证程序或为if提供before_save在某些情况下。为什么有些人认为这不好?有人可以帮我吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

我认为before_savebefore_validation的唯一缺点是当它被理解或使用不正确时

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

除了这些之外,我没有看到before_save有任何问题,因为它可以清除和分解代码的逻辑,并且允许可重用​​性,特别是如果你有模型的子类。

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

答案 1 :(得分:0)

使用回调是标准的Rails练习!如果使用得当,在保持数据完整性方面,它们是很好的DRY助手。回调大量用于数据格式化用户输入(例如从手机号码字段中删除空格或破折号),其中通过验证回复错误会使用户感到沮丧。使用验证来处理无法预测的案例或者其他地方无法预测的数据以及其他地方的回调(例如在保存之前对电子邮件进行下载)。