Добрый день, вопрос такой, как лучше сделать автогенерацию id когда это строка?
миграция:
def change
create_table :names, id: false do |t|
t.string :id, limit: 21, null: false
...
end
add_index :names, :id, unique: true
end
В моделе соответсвенно:
class Name < ActiveRecord::Base
self.primary_key = :id
before_create :set_id
private
def set_id
if self.id.blank?
for attemps in 0..3
self.id = generate_id
return if Name.find_by(id: self.id).nil?
end
end
end
end
Функция generate_id генерирует случайный строковой id длинной 21 символ с помощью SecureRandom.
Очевидно, что это решение может упасть с исключением если одновременно будет сгенерирован одинаковый id, или если количества попыток будет недостаточно. Всвязи с этим вопрос: как сделать что бы было надежно? Я понимаю, что вероятность того что это мое решение даст сбой ничтожно мала, но тем не менее интересно какой путь правильный.
Прочитал статью:
ruby-journal.com/how-to-override-default-primary-k...
Там автор рекомендует не делать execute %Q{ ALTER TABLE "products" ADD PRIMARY KEY ("sku"); }