Rails 5—How to add UUID column
Asked Answered
P

2

5

There doesn't seem to be much documentation on UUIDs in Rails 5. All I've found is this code:

create_table :users, id: :uuid do |t|
  t.string :name
end

That works great if you're creating a table, but what if you're updating an already-existing table?

How do you add a UUID column to a table?

Projectile answered 6/12, 2016 at 4:2 Comment(1)
Here is the answers, check it out. https://mcmap.net/q/1603027/-rails-5-mysql-uuidCiprian
H
11

To migrate from default id to use uuid, try writing migration like this:

class ChangeProjectsPrimaryKey < ActiveRecord::Migration
   def change
     add_column :projects, :uuid, :uuid, default: "uuid_generate_v4()", null: false

     change_table :projects do |t|
       t.remove :id
       t.rename :uuid, :id
     end

     execute "ALTER TABLE projects ADD PRIMARY KEY (id);"
   end
 end
Haynie answered 6/12, 2016 at 13:20 Comment(2)
I got that, but it didn't work, the migration stops and shows this error: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'uuid DEFAULT 'uuid_generate_v4()' NOT NULL' at line 1: ALTER TABLE 'projects' ADD 'new_id' uuid DEFAULT 'uuid_generate_v4()' NOT NULLProjectile
This doesn't work with MySQL. MySQL does not define function uuid_generate_v4 nor does it allow using function in DEFAULT (requires constant).Khalid
C
6

Here's how to add a uuid column to an existing Rails table.

class AddUuidToContacts < ActiveRecord::Migration[5.1]
  def change
     enable_extension 'uuid-ossp' # => http://theworkaround.com/2015/06/12/using-uuids-in-rails.html#postgresql
     add_column :contacts, :uuid, :uuid, default: "uuid_generate_v4()", null: false
     execute "ALTER TABLE contacts ADD PRIMARY KEY (uuid);"
  end
end

If you forget to add enable_extension 'uuid-ossp', you'll get these errors:

PG::UndefinedFunction: ERROR: function uuid_generate_v4() does not exist ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: function uuid_generate_v4() does not exist

Cogency answered 2/3, 2018 at 18:11 Comment(1)
You're assuming the OP is using PostgreSQL. He hasn't provided any information about it, but it appears he is actually using MySQL as he posted a MySQL error.Rocca

© 2022 - 2024 — McMap. All rights reserved.