Генерация номера заказа для использования вместо ID - PullRequest
0 голосов
/ 02 марта 2019

Я хочу создать столбец в таблице «Больше заказов» для номера заказа.

Мне интересно, как лучше всего создать этот номер.

Я создал следующий код вмодель моих заказов:

before_validation :generate_order_number, on: :create

def generate_order_number
    begin
      self.order_number = SecureRandom.random_number(10*10000)
    end while self.class.find_by(order_number: order_number)
  end

Скорее всего, это хорошо, но мне интересно, есть ли лучший / более эффективный способ?

Каков код, всегда по крайней мере 5случайное число или 6 цифр.

Будучи разборчивым, мне бы хотелось, чтобы оно было установлено на n цифр.

Чтобы уточнить, должны быть проверки на уникальность order_number

Обновление:

Рабочий код теперь:

begin
      self.order_number = 5.times.map { [*0..9].sample }.join.to_i
    end while self.class.find_by(order_number: order_number)
end 

1 Ответ

0 голосов
/ 02 марта 2019

Если код такой, то это всегда как минимум 5-значное рандомизированное число или 6 цифр.

Просто неправильно.

1_000_000.
  times.
  map { SecureRandom.random_number(10*10000).to_s.length }.
  uniq
#⇒ [5, 4, 2, 3, 1]

SecureRandom.random_number делаетсгенерировать число в диапазоне 0..arg.В основном вы видите 5 цифр, потому что вероятность выше.


Я бы выбрал более простой подход.

def generate_order_number
  order_number = 5.times.map { [*0..9].sample }.join.to_i
  self.class.find_by(order_number: order_number) ? 
    generate_order_number : order_number
end

NB!Я бы посоветовал сделать так, чтобы 9+ цифр с нуля: меньше шансов попасть в уже существующую и лучше поддерживать будущее, когда число заказов достигнет миллиона:)


Если order_numberфактический атрибут модели, мы должны поставить перед ним явный получатель (self):

def generate_order_number
  self.order_number = 5.times.map { [*0..9].sample }.join.to_i
  self.class.find_by(order_number: order_number) ? 
    generate_order_number : self.order_number
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...