2013-02-08 51 views
3

有好幾次我已經在一個情況下,我們有一個業務驅動的驗證,如模型: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原則。

是否有不同的方法來整合這種邏輯,或者長期保持像#2這樣的策略是否可以管理?

回答

1

您可以爲訂單記錄和特定於版本的驗證添加版本。

2

您可以將此業務邏輯驗證設置爲僅運行:on => :create。我假設你不經常編輯/更新訂單總數。

這將對所有未來訂單生效,但不會影響系統中現有模型的有效性。