W moim Model Mam:
validates :special_code, presence: true, uniqueness: true
before_save :special_code, :regenerate_special_code
Kontroler:
def special_code
( (0...8).map { char = (65 + rand(26)).chr; }[0..rand(2...4)] << rand(1..9) ).join
end
To, co chcę zrobić, to zregenerować special_code
jeśli to nie jest wyjątkowe. Pseudo kod:
def regenerate_special_code
special_code if special_code != unique
end
Obecnie szyny po prostu generują błąd z informacją, że „special_code nie jest unikalny”. (Nie chcę, aby tak się stało. Użytkownik NIGDY nie powinien widzieć tego błędu. Powinien po prostu zadzwonić regenrate_special_code
do momentu utworzenia unikalnego kodu, a następnie zapisz rekord w bazie danych.)
Odpowiedzi:
0 dla odpowiedzi № 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
....
To validate
linia i regenerate_special_code
nie są potrzebne. Mój przykład wygeneruje specjalny kod, aż będzie unikalny.
PS. Mogę zajrzeć do SecureRandom, wygląda na to, że próbujesz wygenerować losowy token dla twojego modelu, a można to osiągnąć znacznie czystiej za pomocą czegoś takiego SecureRandom.uuid