/ / Sprawdza wyjątkowość w niestandardowych warunkach - ruby ​​na szynach, ruby, activerecord, ruby ​​na szynach-4

Sprawdza wyjątkowość w niestandardowych warunkach - ruby-on-rails, ruby, activerecord, ruby-on-rails-4

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

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