【问题标题】:Changing Business Rule Validations Over Time in Rails随着时间的推移在 Rails 中更改业务规则验证
【发布时间】:2013-02-08 06:25:54
【问题描述】:

我曾多次遇到这样的情况,我们的模型具有业务驱动的验证,例如:

class Order < ActiveRecord::Base
  validates_numericality_of :total, :greater_than => 5.0

  # Some more logic
end

在某个时候,老板决定新的最低订单应该是 10 美元,所以我们将验证更新为 10。但是,这意味着任何价值介于 5 美元和 10 美元之间的现有订单将不再验证,并且任何逻辑我调用 order.save() 的地方将开始失败(有时会默默地令人不快)。我在一个大型的 Rails 应用程序中遇到过很多次,但还没有找到一个好的解决方案。一些想法:

  1. 确保在推出代码更改时没有任何待处理的“订单”会受到影响
  2. :if =&gt; Proc.new { |o| o.created_at.nil? or o.created_at &gt; date_new_validation_is_effective } 添加到新验证中,但肯定会很快变得笨拙
  3. 在其他地方“验证”业务规则,例如接受用户指定输入的控制器,而不是作为模型验证。但这违反了在 Rails 中有很多支持者的 Fat Model/Skinny Controller 原则。

是否有不同的方法来整合这个逻辑,或者从长远来看保持像 #2 这样的策略易于管理?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您可以将此业务逻辑验证设置为仅运行:on =&gt; :create。我假设您不经常编辑/更新订单总额。

    这将使其对未来的所有订单生效,同时不影响系统中现有模型的有效性。

    【讨论】:

      【解决方案2】:

      您可以将版本添加到订单记录和特定于版本的验证。

      【讨论】:

        猜你喜欢
        • 2021-07-04
        • 2018-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        • 2018-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多