Best way to create unique token in Rails?
Here's what I'm using. The token doesn't necessarily have to be heard to guess, it's more like a short url identifier than anything else, and I want to keep it short. I've followed some examples I've found online and in the event of a collision, _I think_ the code below will recreate the token, but I'm not real sure. I'm curious to see better suggestions, though, as this feels a little rough around the edges.

    def self.create_token
        random_number = SecureRandom.hex(3)
        "1X#{random_number}"
        
        while Tracker.find_by_token("1X#{random_number}") != nil
          random_number = SecureRandom.hex(3)
          "1X#{random_number}"
        end
        "1X#{random_number}"
      end

My database column for the token is a unique index and I'm also using `validates_uniqueness_of :token` on the model, but because these are created in batches automatically based on a user's actions in the app (they place an order and buy the tokens, essentially), it's not feasible to have the app throw an error.

I could also, I guess, to reduce the chance of collisions, append another string at the end, something generated based on the time or something like that, but I don't want the token to get too long.
Best way to create unique token in Rails?
===

Here's what I'm using. The token doesn't necessarily have to be heard to guess, it's more like a short url identifier than anything else, and I want to keep it short. I've followed some examples I've found online and in the event of a collision, _I think_ the code below will recreate the token, but I'm not real sure. I'm curious to see better suggestions, though, as this feels a little rough around the edges.

    def self.create_token
        random_number = SecureRandom.hex(3)
        "1X#{random_number}"
        
        while Tracker.find_by_token("1X#{random_number}") != nil
          random_number = SecureRandom.hex(3)
          "1X#{random_number}"
        end
        "1X#{random_number}"
      end

My database column for the token is a unique index and I'm also using `validates_uniqueness_of :token` on the model, but because these are created in batches automatically based on a user's actions in the app (they place an order and buy the tokens, essentially), it's not feasible to have the app throw an error.

I could also, I guess, to reduce the chance of collisions, append another string at the end, something generated based on the time or something like that, but I don't want the token to get too long.