生成预订参考号的最佳做法和代码? [关闭]

Posted

技术标签:

【中文标题】生成预订参考号的最佳做法和代码? [关闭]【英文标题】:Best practices and code for generating booking reference number? [closed] 【发布时间】:2021-05-04 17:48:35 【问题描述】:

我想生成预订参考号,以便可以通过语音、写下来、发短信等方式轻松传达它们。

我目前使用 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​​ 标签相关;如果不相关,请随时删除该标签。

【问题讨论】:

【参考方案1】:

你不应该在你的控制器中这样做。

以下示例将在创建记录之前生成一个 8 字符的预订参考,没有零和 Os。请注意,它不会寻找冲突,您应该详细说明,如果您期望有很多记录,有很多不同的方法可以做到这一点,包括模型验证等。您可能还想将 booking_reference 上的索引添加到您的表中。

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

【讨论】:

什么是完全证明的方法来确保生成的代码没有重复? 一个选项是在 while 循环中生成引用,检查没有其他记录使用它,并且仅在退出循环后分配。还应该有验证和异常处理,在生产中仍然有一些事情可以左右你。 列上应该有uniqe DB 约束,以确保您提出的解决方案不会以重复的预订代码结束。 @Amit Patel,绝对是。他可以发布不同的问题或查看现有的解决此方面的答案。

以上是关于生成预订参考号的最佳做法和代码? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

创建链接以重置密码的最佳做法是啥? [关闭]

(在表格中搜索)最佳做法是啥? [关闭]

在 foreach 循环中使用 try-catch 块的最佳做法是啥? [关闭]

在promise中超时函数的最佳一般做法是啥[关闭]

排空或清除 Google Cloud pubsub 主题的最佳做法 [关闭]

使用 GUID 作为主键的最佳做法是啥,特别是在性能方面? [关闭]