/ / Convalida l'unicità con condizioni personalizzate: ruby-on-rails, ruby, activerecord, ruby-on-rails-4

Convalida l'unicità con condizioni personalizzate: ruby-on-rails, ruby, activerecord, ruby-on-rail-4

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 № 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
....

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