3

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

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 => Proc.new { |o| o.created_at.nil? or o.created_at > date_new_validation_is_effective }在新验证中添加一个,但可以肯定这很快就会变得笨拙
  3. 在其他地方“验证”业务规则,例如接受用户指定输入的控制器,而不是作为模型验证。但这违反了在 Rails 中有很多支持者的 Fat Model/Skinny Controller 原则。

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

4

2 回答 2

2

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

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

于 2013-08-24T18:29:35.193 回答
1

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

于 2013-02-08T06:43:44.177 回答