生成预订参考号的最佳实践和代码? 最佳做法问题

问题描述

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

我目前使用 uuid,它运行良好,但导致用户体验不佳,因为 510632cc-3aa4-41c2-8bd0-cbd2bd671ef4 之类的字符串难以沟通。

这是一个 Airbnb 预订参考,它很好、简短且易于口头交流:

enter image description here

最佳做法

我考虑了一下,决定使用所有大写字母,除了 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 个字符的预订参考,没有零和 O。请注意,它不会寻找冲突,您应该详细说明,如果您期望有很多记录,有许多不同的方法可以做到这一点,包括模型验证等。您可能还想在您的表中添加关于 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