生成预订参考号的最佳做法和代码?
Best practices and code for generating booking reference number?
我想生成预订参考号,以便可以轻松地通过语音、书面、短信等方式传达它们。
我目前使用 uuid,效果很好,但导致用户体验不佳,因为像 510632cc-3aa4-41c2-8bd0-cbd2bd671ef4
这样的字符串很难传达。
这是一份 Airbnb 预订参考,简短且易于口头交流:
最佳实践
我考虑了一下,决定使用除 O
之外的所有大写字母(并且没有小写字母)和数字 1-9。
这导致 25 + 9 = 34 个可能的字符。因此可以
- 34^6 = 1544804416(15亿)个6字码
- 或者,如果这还不够,34^7 = 52523350144(520 亿)个 7 字符代码
在我的用例中,6 个字符就足够了。
总而言之,booking_reference
应该是一个随机的字符串 A-Z 除了 O 和数字 1 -9(不是 0),没有小写字母。并且该列必须是唯一的 - 没有重复的字符串。
问题
我是否在上述想法中封装了最佳实践,假设我创建了一个 booking_reference
列来存储字符串,我如何在 bookings#create
控制器操作中生成这些?
注意:我不确定它是否与 ruby 标签相关;如果不相关,请随时删除该标签。
你不应该在你的控制器中这样做。
下面的示例将在创建记录之前生成一个 8 个字符的预订参考,没有零和 Os。请注意,它不会查找冲突,如果您期望有很多记录,您应该详细说明,有许多不同的方法可以做到这一点,包括模型验证等。您可能还想将 booking_reference 上的索引添加到您的 table.
class YourModel < ApplicationRecord
# ...
before_create :generate_booking_reference
def generate_booking_reference
self.booking_reference = 8.times.map { [*'1'..'9', *'a'..'n', *'p'..'w'].sample }.join
# TODO check for collisions
end
# ...
end
我想生成预订参考号,以便可以轻松地通过语音、书面、短信等方式传达它们。
我目前使用 uuid,效果很好,但导致用户体验不佳,因为像 510632cc-3aa4-41c2-8bd0-cbd2bd671ef4
这样的字符串很难传达。
这是一份 Airbnb 预订参考,简短且易于口头交流:
最佳实践
我考虑了一下,决定使用除 O
之外的所有大写字母(并且没有小写字母)和数字 1-9。
这导致 25 + 9 = 34 个可能的字符。因此可以
- 34^6 = 1544804416(15亿)个6字码
- 或者,如果这还不够,34^7 = 52523350144(520 亿)个 7 字符代码
在我的用例中,6 个字符就足够了。
总而言之,booking_reference
应该是一个随机的字符串 A-Z 除了 O 和数字 1 -9(不是 0),没有小写字母。并且该列必须是唯一的 - 没有重复的字符串。
问题
我是否在上述想法中封装了最佳实践,假设我创建了一个 booking_reference
列来存储字符串,我如何在 bookings#create
控制器操作中生成这些?
注意:我不确定它是否与 ruby 标签相关;如果不相关,请随时删除该标签。
你不应该在你的控制器中这样做。
下面的示例将在创建记录之前生成一个 8 个字符的预订参考,没有零和 Os。请注意,它不会查找冲突,如果您期望有很多记录,您应该详细说明,有许多不同的方法可以做到这一点,包括模型验证等。您可能还想将 booking_reference 上的索引添加到您的 table.
class YourModel < ApplicationRecord
# ...
before_create :generate_booking_reference
def generate_booking_reference
self.booking_reference = 8.times.map { [*'1'..'9', *'a'..'n', *'p'..'w'].sample }.join
# TODO check for collisions
end
# ...
end