LoginSignup
11
8

More than 5 years have passed since last update.

Rails4 で UUIDを使う

Posted at

投稿がフロントに偏ってたので
バックエンドの方も少し書いておこうと思う

ちなみに今回、新規テーブル Postgresql がターゲットになると思う。
mysql だとちょっと泣きを見るかも

UUIDって何よ

まずUUIDとは「絶対かぶらないID」だと思えばいい

ビックデータ や ディープラーニング等の統計処理
サードパティーとのデータ連携

いろんなデータがごちゃまぜに利用される中、システムないおよびテーブル内でユニークであることはもちろん、共有システムの全テーブル中でも常に一意のデータを指し示す事ができる。
それがUUIDだ(と思う)

ログデータや、コンテンツ、ユーザ情報など重要な情報にはこれを付与しておくのは悪い手ではないと思う。

独自の採番ロジックを使うコストを払うより、この辺りは標準使うほうが良い場合もあるはず。

UUIDの問題点

としてよくあげられるのが「長い」ということ。
実際URLにいくつも入ってきたら見た目が悪い。

これに関しては、
- UIDをBase64で圧縮する
- 表示用に別のidを用意しておく
等の手がある。

では本題にうつる。

Rails4 にUUIDを導入する。

UUIDを導入するには大きくどちらかを選ぼう
1. Gemを使う
2. Rails標準の機能を使う

Postgresを利用しているならば、Rails標準一択でよいと思う
他のDBMSを利用しているならば古いGemとの格闘を覚悟しよう

Gemを使う

https://github.com/jashmenn/activeuuid
railsでuuidを扱うgemはいくつかある。

... しかしどれも古い。
使ってみてメッチャ嵌った。

結局

SecureRandom.uuid

を利用して地道に書くのがいい気がする。
私は途中で投げ出してPostgresに逃げた

Rails標準の機能を使う

楽、メッチャ楽。

まずPostgresqlにUUIDを有効にする命令を投げる必要がある。

$ rails generate migration enable_uuid_ossp_extension

生成されたmigrationを編集して

class EnableUuidOsspExtension < ActiveRecord::Migration
  def change
    enable_extension 'uuid-ossp'
  end
end

次に新規のテーブルに導入する場合、
migrationファイルの create_table に id: :uuid と追加して

create_table :users, id: :uuid do |t|

外部キーの参照はこんな感じに設定

Before

t.references("user")

After

t.uuid :user_id
## polymorphic = true の場合
# t.string :user_type

これだけでたぶんうまくいくと思います!

11
8
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
11
8