Reputation: 28312
I have a requirement to be able to identify a record in a table, in this case a user table, by a unique key which does not give away the ordering of the records in the table.
Currently I have primary key field and the routes that are generated look like:
/users/1
However, I'd like to be able to generate a route like:
/users/kfjslncdk
I can wire everything up on the route side, database side etc.. but I'm not sure what the best way to generate a unique string identifier would be in rails. I'd like do something like:
before_save :create_unique_identifier
def create_unique_identifier
self.unique_identifier = ... magic goes here ...
end
I was thinking I could use the first part of a guid created using UUIDTools, but I'd need to check to make sure it was unique before saving the user.
Any advice would be greatly appreciated!
Upvotes: 18
Views: 21740
Reputation: 34013
Another possiblity is to use SecureRandom.base64
which in comparison to hex
additionally use capitalized letters and “+”, “/”, “=”. Documentation.
Example:
def generate_identifier
begin
uid = SecureRandom.base64(8)
end while self.class.exists?(uid: uid)
self.uid = uid
end
Upvotes: 5
Reputation: 176352
Upvotes: 5
Reputation: 13433
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
Upvotes: 59
Reputation: 10056
Save yourself the trouble from storing the obfuscated id and simply encode the id with base 62 (a-z, A-Z, 0-9) but custom define the order of the "digits". This will make it very complicated to figure out the order.
I once wrote something a class that does that (might need some refactoring): https://gist.github.com/4058176
Upvotes: 3