Nel mio Modello Io ho:
validates :special_code, presence: true, uniqueness: true
before_save :special_code, :regenerate_special_code
controllore:
def special_code
( (0...8).map { char = (65 + rand(26)).chr; }[0..rand(2...4)] << rand(1..9) ).join
end
Quello che voglio fare è rigenerare il special_code
se non è unico. Pseudo codice:
def regenerate_special_code
special_code if special_code != unique
end
Attualmente le rotaie generano solo un errore che dice "special_code non è univoco". (Non voglio che ciò accada. L'utente non dovrebbe MAI vedere questo errore. Dovrebbe semplicemente chiamare regenrate_special_code
fino a quando non viene creato un codice univoco, quindi memorizza il record nel db.)
risposte:
0 per risposta № 1model.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
....
Questo validate
linea e il regenerate_special_code
non sono necessari. Il mio esempio genererà un codice speciale fino a quando non sarà univoco.
PS. Guarderei SecureRandom, sembra che tu stia tentando di generare un token casuale per il tuo modello e questo potrebbe essere realizzato molto più pulito con qualcosa come SecureRandom.uuid