2010-07-01 2 views
3

У меня есть базовая модель Rails с двумя свойствами, имя и код. У меня есть validates_uniqueness_of для Код Недвижимость. Тем не менее, я хотел бы настроить сообщение: показать имя дубликата. Есть ли способ получить доступ к этому дублирующему элементу?Rails - validates_uniqueness_of: доступ к дублируемому элементу?

Например, скажем, я сначала ввести запись называется Expired с кодом EXP. Затем я ввожу Опыт с кодом EXP. Я хотел бы: сообщение сказать что-то вроде «Код, уже принятый Expired».

> 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 построить что держит дубликат объекта, так что я могу получить доступ к нему, как я в: сообщение? Или есть другой способ, которым я могу запустить код, чтобы определить дубликат, когда эта проверка активируется?

ответ

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

Great! Работает как шарм! Не знаю, почему я никогда не знал об этом, почему я ничего не мог найти об этом. Большое спасибо! – istrasci

+0

Добро пожаловать:] –

+0

Думаю, я бы добавил, что нам нужно добавить логику, чтобы убедиться, что _self.id_ - это не то же самое, что _model.id_. В противном случае мы никогда не сможем обновить существующий элемент (если только это не требуется). – istrasci

2

Как за @j но как обратный вызов проверки и предназначаться сообщение специально для неисправного атрибута

validate do |model| 
    duplicate = Model.first(:conditions => {:code => model.code}) 
    if duplicate 
    model.errors.add :code, "already taken" 
    end 
end 
Смежные вопросы