关于 ruby?? on rails:生成唯一的随机字符串以识别记录

Generating unique random string for identifying a record

我需要能够通过唯一键识别表中的记录,在本例中为用户表,该键不会泄露表中记录的顺序。

目前我有主键字段,生成的路由如下:

1
/users/1

但是,我希望能够生成如下路线:

1
/users/kfjslncdk

我可以在路由端、数据库端等连接所有东西。但我不确定在 rails 中生成唯一字符串标识符的最佳方法是什么。我想做类似的事情:

1
2
3
4
5
before_save :create_unique_identifier

def create_unique_identifier
    self.unique_identifier = ... magic goes here ...
end

我想我可以使用使用 UUIDTools 创建的 guid 的第一部分,但我需要在保存用户之前检查以确保它是唯一的。

任何建议将不胜感激!


1
2
3
4
5
6
7
8
before_create :create_unique_identifier

def create_unique_identifier
  loop do
    self. unique_identifier = SecureRandom.hex(5) # or whatever you chose like UUID tools
    break unless self.class.exists?(:unique_identifier => unique_identifier)
  end
end


Ruby 1.9 包含一个内置的 UUID 生成器:SecureRandom.uuid


  • uuid
  • uuid工具
  • 如何在 Ruby 中创建小而独特的令牌


省去存储混淆 id 的麻烦,只需使用 base 62 (a-z, A-Z, 0-9) 对 id 进行编码,但自定义定义"数字"的顺序。这将使计算顺序变得非常复杂。

我曾经写过一些可以做到这一点的类(可能需要一些重构):https://gist.github.com/4058176


另一种可能是使用 SecureRandom.base64,与 hex 相比,它额外使用大写字母和""、"/"、"="。文档。

示例:

1
2
3
4
5
6
def generate_identifier
  begin
    uid = SecureRandom.base64(8)
  end while self.class.exists?(uid: uid)
  self.uid = uid
end