【发布时间】: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 应用程序中遇到过很多次,但还没有找到一个好的解决方案。一些想法:
- 确保在推出代码更改时没有任何待处理的“订单”会受到影响
- 将
:if => Proc.new { |o| o.created_at.nil? or o.created_at > date_new_validation_is_effective }添加到新验证中,但肯定会很快变得笨拙 - 在其他地方“验证”业务规则,例如接受用户指定输入的控制器,而不是作为模型验证。但这违反了在 Rails 中有很多支持者的 Fat Model/Skinny Controller 原则。
是否有不同的方法来整合这个逻辑,或者从长远来看保持像 #2 这样的策略易于管理?
【问题讨论】:
标签: ruby-on-rails