これが私が使っているものです。トークンは、推測のために必ずしも聞かれる必要はありません。それは何よりも短いURL識別子のようなものであり、私はそれを短く保ちたいです。私はオンラインで見つけたいくつかの例に従いましたが、衝突が発生した場合、以下のコードでトークンが再作成されると思いますが、確信が持てません。しかし、これは縁のあたりが少し荒く感じられるので、より良い提案を見つけたいと思っています。
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
トークンのデータベース列は一意のインデックスでありvalidates_uniqueness_of :token
、モデルでも使用していますが、これらはアプリでのユーザーのアクションに基づいて自動的にバッチで作成されるため(注文してトークンを購入します)、それはアプリにエラーをスローさせることはできません。
また、衝突の可能性を減らすために、最後に別の文字列を追加することもできます。これは、時間に基づいて生成されたものなどですが、トークンが長くなりすぎないようにします。