В Rails как можно сгенерировать уникальный серийный номер для нового экземпляра модели?

#ruby-on-rails #auto-increment #ruby-on-rails-3

#ruby-on-rails #автоматическое увеличение #ruby-on-rails-3

Вопрос:

В Rails я ищу способ сгенерировать автоматически увеличивающийся серийный номер для внутреннего ведения записей для новых экземпляров модели. Я хотел бы избежать создания специфичного для базы данных кода и скорее иметь решение, которое будет работать независимо от базы данных. Моя текущая идея состоит в том, чтобы дождаться сохранения модели, а затем получить идентификатор сохраненной модели и использовать его в качестве суффикса серийного номера, но тогда мне пришлось бы сохранять каждую запись дважды при создании.

Есть идеи?

Спасибо, что посмотрели!

Комментарии:

1. Одна из причин, по которой я бы не рекомендовал этого делать, заключается в том, что вы, вероятно, в конечном итоге запустите несколько приложений rails и сохранить уникальный номер во всех ваших приложениях и нескольких физических блоках будет очень сложно. Вероятно, есть способ выполнить то, что вы хотите, с помощью базы данных. Можете ли вы пролить больше света на формат серийного номера и ограничения?

2. Спасибо за ваш ответ. Серийный номер будет представлять собой строку в формате PLN-xxxxxx. Я подумываю просто начать с «PLN-100000» и увеличивать оттуда.

3. Таким образом, все записи будут иметь PLN- перед их серийными номерами?

4. Правильно, это просто префикс, который отличает разные модели.

5. Почему бы просто не использовать идентификатор и не добавить PLN- префикс в код при его отображении? И почему вы хотите избежать использования базы данных?

Ответ №1:

Я бы рекомендовал вместо этого создать серийную модель в модели. Это даст вам больше гибкости при настройке формата серийного номера позже, и вместо этого уникальное автоматическое увеличение сохранится в базе данных. Используйте обычный целочисленный первичный ключ с автоматическим увеличением, а затем создайте серийный номер следующим образом:

 class Product
  def serial_number
    "PLN-%.6d" % id
  end
end
  

Итак, если у вас есть продукт с id = 567, например, у вас будет серийный номер, подобный этому:

 Product.find(567).serial_number
=> PLN-000567