在Rails中随时间更改业务规则验证

时间:2013-02-08 06:25:54

标签: ruby-on-rails

我曾经多次遇到过我们拥有业务驱动验证模型的情况,例如:

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原则。
  4. 是否有不同的方法来整合这种逻辑,或者从长远来看如何保持像#2这样的策略可管理?

2 个答案:

答案 0 :(得分:2)

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

这将使所有订单生效,而不会影响系统中现有模型的有效性。

答案 1 :(得分:1)

您可以在订单记录和版本特定验证中添加版本。