有好幾次我已經在一個情況下,我們有一個業務驅動的驗證,如模型:Rails中不斷變化的業務規則驗證過時間
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這樣的策略是否可以管理?