2010-07-01 19 views
3

我有一個基本的Rails模型有兩個屬性,名稱代碼。我有validates_uniqueness_of代碼屬性。但是,我想定製:消息以顯示重複的名稱。有什麼方法可以訪問這個重複項目嗎?Rails - validates_uniqueness_of:訪問重​​復的項目?

例如,假設我首先輸入一個名爲的記錄,已過期,代碼爲EXP。然後我輸入經驗與代碼EXP。我希望:消息能夠說出類似「代碼已被過期使用」的內容。

> m1 = Model.new(:name => 'Expired', :code => 'EXP') 
> m2 = Model.new(:name => 'Experience', :code => 'EXP') 
> m1.save! 
> m2.save! 

validates_uniqueness_of :code, 
    :message => "Code already taken by #{duplicate.name}" 

是否有任何內置的Rails構造持有重複的對象,以便我可以像訪問它那樣訪問它:message?或者有沒有其他的方式可以運行代碼來確定這個驗證被觸發時的重複?

回答

3

我相信你必須寫一個自定義驗證方法。喜歡的東西:

def validate 
    model = Model.first(:conditions => {:code => self.code}) 
    unless model.blank? && (self.id != model.id) 
    errors.add_to_base "Code already taken by #{model.name}" 
    end 
end 
+0

太好了!奇蹟般有效!不知道爲什麼我從來不知道爲什麼我無法找到它。非常感謝! – istrasci 2010-07-01 20:23:22

+0

不客氣:] – 2010-07-01 20:31:33

+0

我想補充一點,我們需要添加邏輯來確保_self.id_與_model.id_不一樣。否則,我們將永遠無法更新現有項目(除非這是您想要的行爲)。 – istrasci 2010-07-26 17:31:36

2

按@j但作爲一個驗證回調並專門針對該消息以確定發生故障的屬性

validate do |model| 
    duplicate = Model.first(:conditions => {:code => model.code}) 
    if duplicate 
    model.errors.add :code, "already taken" 
    end 
end