2009-11-29 11 views
9

Tengo un requisito para poder identificar un registro en una tabla, en este caso una tabla de usuario, mediante una clave única que no proporciona el orden de los registros en la tabla .Generando una cadena aleatoria única para identificar un registro

Actualmente tengo campo de clave principal y las rutas que se generan se parecen:

/users/1 

Sin embargo, me gustaría ser capaz de generar una ruta como:

/users/kfjslncdk 

que pueda conectar todo en el lado de la ruta, lado de la base de datos, etc., pero no estoy seguro de cuál sería la mejor manera de generar un único identificador de cadena en los rieles. Me gustaría hacer algo como:

before_save :create_unique_identifier 

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

Estaba pensando que podría utilizar la primera parte de un GUID creado usando UUIDTools, pero me gustaría que comprobar para asegurarse de que era único antes de guardar el usuario.

¡Cualquier consejo sería muy apreciado!

Respuesta

8

Ruby 1.9 includes incorporado un generador de UUID: SecureRandom.uuid

38
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 
3

ahorrarse el trabajo de almacenar el id ofuscado y simplemente codificar la identificación con base 62 (a-z, A-Z, 0-9) pero personalizado define el orden de los "dígitos". Esto hará que sea muy complicado averiguar el orden.

vez escribí algo una clase que hace que (podría necesitar algo de refactorización): https://gist.github.com/4058176

Cuestiones relacionadas