最近、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