Ось що я використовую. Маркер не обов'язково повинен бути чути, щоб здогадуватися, він більше схожий на короткий ідентифікатор URL, ніж будь-що інше, і я хочу, щоб він був коротким. Я переглянув кілька прикладів, які я знайшов в Інтернеті, і в разі зіткнення, думаю, що код нижче відтворить маркер, але я не впевнений у цьому. Мені цікаво побачити кращі пропозиції, оскільки це відчувається трохи нерівним по краях.
def self.create_token
random_number = SecureRandom.hex(3)
"1X#{random_number}"
while Tracker.find_by_token("1X#{random_number}") != nil
random_number = SecureRandom.hex(3)
"1X#{random_number}"
end
"1X#{random_number}"
end
Мій стовпчик бази даних для маркера - це унікальний індекс, і я також використовую validates_uniqueness_of :token
модель, але оскільки вони створюються партіями автоматично на основі дій користувача в додатку (вони замовляють замовлення та купують жетони, по суті), це не можливо, щоб програма додала помилку.
Я можу також міг зменшити ймовірність зіткнень, додати ще один рядок наприкінці, щось створене на основі часу чи щось подібне, але я не хочу, щоб маркер надто довгий.