2009-04-17 134 views
0

我需要根據模型中的某個字段對Rails中的模型進行條件驗證。這是earlier question的後續行動,它促使開發出一種感覺不正確的解決方案。ActiveRecord中的條件驗證

我有很多ActiveRecord模型都是基於'Order Model',其縮寫版本如下所示。

class Order < ActiveRecord::Base 

    has_many: previous_addresses 
    has_one: applicant 
    has_one: current_address 
end 

所有其他型號屬於訂單。

我希望根據訂單的公司屬性對申請人,current_address等各種模式進行不同的驗證。

我已經開發了一個解決方案,涉及一個完整的手動驗證套件,支持所有標準activeRecord驗證器。這個解決方案是用許多表格來開發的,例如模型,字段,field_items等,它們描述了驗證並且相當於很多數據。

我現在必須處理這些數據,併爲每個連接到的新公司進行復制和編輯。這是乏味和容易出錯的。

雖然在閱讀'The Rails Way'時,我發現Obie Fernandez描述瞭如何將驗證代碼以ActiveRecord驗證語句的形式保存在數據庫中,並在運行時根據公司id的值將其注入到模型中。

我想象在表保存數據,如下列: -

 
company: 200 
model: person 
Code validates_length_of :middle_name, :maximum => 20, :allow_nil => true 

company: 201 
model: person 
Code validates_length_of :middle_name, :maximum => 1, :allow_nil => true 

因此,對於公司201「約翰」中間名就不能通過驗證,但是這將是確定的公司200

有沒有人看過這樣做,如果是的話,他們有任何提示/建議如何做到這一點,甚至更好沒有任何人鏈接到教程/代碼這樣做?

回答

1

這聽起來像你需要的是能夠分別驗證每個記錄。如果這是真的,那麼你可以使用validates_each。在此塊中,您可以傳遞邏輯來評估模型的成員。

validates_each :middle_name do |record, attr, value| 
    if record.company == 201 
    record.errors.add attr, 'cannot be more than 1 character' if value.length > 1 
    elsif record.company == 200 
    record.errors.add attr, 'must be less than 20 characters' if value.length > 1 
    end 
end 
+0

這無疑會起作用,但我試圖避免隨着公司數量增長而導致的巨大ifs連鎖。這個想法是爲每個公司的數據庫添加驗證代碼,而不是將它們全部列在模型中。這應該會使維護更容易 – 2009-04-18 07:05:49