#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