2010-05-21 50 views
2

我剛剛開始在Rails中,並試圖開發一個簡單的應用程序。我需要驗證提交給應用程序的三個值 - 每個值都必須符合相同的驗證條件。使用除非在rails唯一性驗證

驗證過程非常簡單: 如果unqiue,值爲空或等於「p」或「d」,則此值有效。

下面讓我中途有:

validates_uniqueness_of :value1, :value2, :value3, :allow_nil => true 

我認爲我可以使用:除非來檢查值是否「P」或「d」,不過,我可以不知道怎樣。

我想我想結合validates_uniqueness_of與validates_inclusion_of。

有什麼建議嗎?

回答

2

有幾種方法可以做到這一點。我可能會像這樣的東西去:

validates_uniqueness_of :wallport_id, :allow_nil => true, :unless Proc.new { |u| u.wallport_id == 'p' or u.wallport_id == 'd' } 

你也可以打破額外的邏輯出它自己的方法,這樣的:

validates_uniqueness_of :wallport_id, :unless :has_nonunique_wallport_id 

NONUNIQUE_WALLPORT_IDS = ['p', 'd', nil] 

def has_nonunique_wallport_id 
    NONUNIQUE_WALLPORT_IDS.include? wallport_id 
end 

或推動整個驗證在其自身方法是這樣的:

validate :has_valid_wallport_id 

def has_valid_wallport_id 
    # check wallport id and return either true or false 
end 

最好的辦法可能取決於你找到最可讀的,你可能要暴露給你的代碼的其他部分,其功能(例如,有沒有人需要知道關於有效的非唯一的wallport ID?)以及您期望可能會改變的內容(例如,您以後會添加更多有效的非唯一ID嗎?)。還有幾種不同的方法可以進行實際檢查,這些方法也可以歸結爲您發現最具可讀性的內容以及您認爲系統可能發展的方式。

+0

好 - 我在你回答的時候更新了問題,指定我想以同樣的方式驗證一些變量 - 我認爲如果我爲每個變量定義一個驗證並且它是可讀的。非常感謝。我對着那個撞了一下頭。 – dunxd 2010-05-21 15:36:20