Обратный звонок против проверки - PullRequest
1 голос
/ 07 июля 2011

Я создал обратный вызов при создании нового объекта Client вместо использования метода проверки 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

Примечание:

  • Rails v2.3.5

Ответы [ 4 ]

2 голосов
/ 07 июля 2011

Если вы хотите выбрать собственный путь валидатора:

class Client < ActiveRecord::Base
  validate :client_uniqueness

protected

  def client_uniqueness
    duplicates = self.class.all(:conditions => {
      :first_name => first_name,
      :middle_name => middle_name,
      :last_name => last_name,
      :date_of_birth => date_of_birth
    })

    if duplicates.present?
      errors.add_to_base "Client exists as #{duplicates.map(&:name).to_sentence}"
    end
  end
end
1 голос
/ 07 июля 2011

Вы не должны помещать проверочный код в обратные вызовы before_validation. Измените before_validation_on_create :prevent_duplicate_clients на validate :prevent_duplicate_clients

1 голос
/ 07 июля 2011

Нет причин, по которым это невозможно сделать при проверке. С помощью метода validate class ( Doc ).

Если вы хотите более чистую модель или используете ее в нескольких моделях, она может быть немного СУШЕН при использовании специального валидатора.

Тогда вы можете получить что-то вроде этого

class Client < ActiveRecord::Base
  validates_uniq_with_custom_message :first_name, :middle_name, :dob #etc
end

Вот хороший блог по теме

0 голосов
/ 07 июля 2011

Я думаю, что вы на правильном пути - мой вопрос заключается в том, следует ли добавить ошибку или просто добавить детали к существующему клиенту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...