Я создал функцию обратного вызова при создании нового объекта клиента вместо того, чтобы использовать метод validates_uniqueness_of
проверки, потому что:Обратный вызов против проверки
- Я хочу, чтобы найти клиента, который уже существует
- Добавить существующую информацию клиента к моему базовое сообщение об ошибке
Мой вопрос: есть ли более элегантный способ достижения этого, чем мое решение ниже?
У меня есть следующий модель:
class Client < ActiveRecord::Base
before_validation_on_create :prevent_duplicate_clients
private
def prevent_duplicate_clients
client = self.class.find(:all, :conditions => ["first_name = ? AND middle_name = ? AND last_name = ? AND date_of_birth = ?", self.first_name, self.middle_name, self.last_name, self.date_of_birth])
if client.size >= 1
self.errors.add(:base, "Client exists as #{client.first.name}")
false
end
end
end
NB:
- Rails v2.3.5
& @CaptainPete: Если я переведу свой callback на 'validate', это не будет вызвано для создания и обновления методов, так как я хочу, чтобы это произошло для новых записей – Coderama
, вы можете передать: on =>: create to the validate class macro – paukul
Однако я бы избавился от получения результатов из базы данных и вместо этого использовал счет. Получение результатов не требуется, потому что вы уже знаете, что такое значение, скажем, имя fist_name, поскольку вы проверяете уникальность. – paukul