Ruby on Rails 4.2 feat. PostgreSQL: モデルのプライマリーキー | ベンチャー企業 CIO: 池谷 義則ブログ&経営、ビジネス、プログラミング技術や便利なオープンソースの紹介

ベンチャー企業 CIO: 池谷 義則ブログ&経営、ビジネス、プログラミング技術や便利なオープンソースの紹介

SKYAVY, INC. CIOの池谷義則のブログ & ベンチャー企業 & 経営、ビジネス、プログラミング技術や便利なオープンソースの紹介

最近、Ruby on Rails(RoR)の作業をしています。
Rubyも初めてだし、Railsももちろん初めてなわけで、悪戦苦闘w

130個近いテーブル、モデルの作成作業をしている中で、情報共有しようと思ったことです。

通常、何も指定しない場合、idがプライマリーキーとして設定されて、Auto incrementされていきますが、そうするとコンテンツを表示するときに、
http://domain.com/item/100
の用に、IDが表示されてしまう。
(デメリットとしては、競合に「どれだけの投稿があるのか?」等の情報を安易に調べられてしまう)

だからって、StringのSlugを表示するようなモデルでも無い。例えばMessageのようなコンテンツ。
そこで、UUID。
こんな感じの文字列になります。


6bc32341-689f-495e-bfe5-d3d941101f90


12bytesなので、通常のInteger型より大きいので、使う必要がないところでは、パフォーマンス低下になるので使わない方がいいでしょうね。

んで、これをRoRに実装。

まず前提として、PostgreSQLにExtensionを追加

  $ psql server

  server=# CREATE EXTENSION "uuid-ossp";


そして、migrate ファイルをこんな感じへ

class CreateMessageThreads < ActiveRecord::Migration

  def change

    #enable_extension 'uuid-ossp’  # もし、rake コマンドでPostgreSQLへのROOT権限があるのであればこれでもOK

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

      t.string :title

      t.string :author

      t.timestamps

    end

  end

end


その時、  $ rake db:migrate で ::UndefinedFunction: ERROR: function uuid_generate_v4() does not exist となるなら、"uuid-ossp"エクステンションが正常に入っていないので、確認を。

作成したテーブルとRelationを組みたい場合はこうです。

class CreateMessages < ActiveRecord::Migration

  def change

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

      t.uuid :message_thread_id, index: true, null: false

      t.references :account, index: true, null: false

      t.text :message, null: false

      t.datetime :deleted_at




      t.timestamps null: false

    end

    add_foreign_key :messages, :message_threads

    add_foreign_key :messages, :accounts

  end

end

追記: Postgreへ、管理権限があるユーザーで接続している場合は、
の様に  enable_extension 'uuid-ossp'  をMigrationファイルき記載すれば、都度PostgreSQLにエクステンションを手動で追加せずにすむ