/ / Valida a exclusividade com condições personalizadas - ruby-on-rails, ruby, activerecord, ruby-on-rails-4

Valida a exclusividade com condições personalizadas - ruby-on-rails, ruby, activerecord, ruby-on-rails-4

No meu Modelo Eu tenho:

validates :special_code, presence: true, uniqueness: true
before_save :special_code, :regenerate_special_code

Controlador:

def special_code
( (0...8).map { char = (65 + rand(26)).chr; }[0..rand(2...4)] << rand(1..9) ).join
end

O que eu quero fazer é regenerar o special_code se não for único. Pseudo-código:

def regenerate_special_code
special_code if special_code != unique
end

Atualmente, os trilhos emitem um erro dizendo "código_específico não é exclusivo". (Eu não quero que isso aconteça. O usuário NUNCA deve ver esse erro. Ele deve apenas chamar regenrate_special_code até que um código exclusivo seja criado e, em seguida, armazene o registro no banco de dados.)

Respostas:

0 para resposta № 1

model.rb

....
before_save :generate_special_code
....
private
def generate_special_code
self.special_code = ( (0...8).map { char = (65 + rand(26)).chr; }[0..rand(2...4)] << rand(1..9) ).join
generate_special_code if Model.exsits?(special_code: self.special_code)
end
....

este validate linha e o regenerate_special_code não são necessários. Meu exemplo irá gerar algum código_específico até ser exclusivo.

PS. Examinando o SecureRandom, parece que você está tentando gerar um token aleatório para o seu modelo e isso pode ser realizado de maneira muito mais limpa com algo como SecureRandom.uuid