LoginSignup
14
12

More than 5 years have passed since last update.

Railsのidにuuidを使う方法(mysql2の場合)

Posted at

そもそもuuidとは

UUIDとはUniversally Unique Identifierの略。
普遍的にユニークなIDということです。
誰でも作れて世界中で被らないたった一つのIDと言えます。
こんな感じです→例:550e8400-e29b-41d4-a716-446655440000

なぜuuidを使うのか

・IDから情報を推測しずらくなる。IDから情報を調べられて、サービスにどのくらいユーザーや投稿数などがあるのかを予測される心配が無くなります。
・データ情報がいくら増えようと値が限界を迎えることがなくなる。(mysqlでのデフォルトのidタイプであるbigintは、9223372036854775807までと値が決まっている)

idにuuidを使う方法

idのデータ形式を変更

デフォルトではidという名前を持つintegerのカラムをテーブルの主キーとして使用しています。

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | YES  |     | NULL    |                |
| age        | int(11)      | YES  |     | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

これをstring型(文字列)にタイプを変更します。

command
rails g migration ChangeColumnToUser(テーブル名)
20190210010422_change_column_to_user.rb
class ChangeColumnToUser < ActiveRecord::Migration[5.2]
# 変更内容
  def up
    change_column :users, :id, :string
  end

  # 変更前の状態
  def down
    change_column :users, :id, :integer
  end
end

up・downメソッドでrollback(前のバージョンに戻す)できるようにします。

command
rails db:migrate
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id         | varchar(255) | NO   | PRI | NULL    |       |
| name       | varchar(255) | YES  |     | NULL    |       |
| age        | int(11)      | YES  |     | NULL    |       |
| created_at | datetime     | NO   |     | NULL    |       |
| updated_at | datetime     | NO   |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

これでidのタイプを変更することが出来ました。

モデルにuuidを実装

以下のような処理を入れて,実現します。

models/user.rb
class User < ApplicationRecord
  before_create :generate_token

  def generate_token
    self.id = loop do
      random_token = SecureRandom.uuid
      break random_token unless self.class.exists?(id: random_token)
    end
  end
end

参考:railsでモデルにuuidを持たせる実装について - スタック・オーバーフロー

結果

これで試しに投稿してみると、下記の通りidにuuidを使うことができるようになっています。

+--------------------------------------+--------+------+---------------------+---------------------+
| id                                   | name   | age  | created_at          | updated_at          |
+--------------------------------------+--------+------+---------------------+---------------------+
| 9d5d5b70-4062-4253-99c5-e28998bcff13 | 太郎   |   20 | 2019-02-10 01:25:32 | 2019-02-10 01:25:32 |
+--------------------------------------+--------+------+---------------------+---------------------+

もちろん他にもいろんな方法があると思いますので、こっちの方が良いなどあれば教えてください!

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12