Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge pull request #10404 from chadmoone/fix-pg-uuid-default

Allow override of PostgreSQL UUID primary key default
  • Loading branch information...
commit b2a02c89febb12368bd5fbff498bd94199a407b6 1 parent 4d3eee6
@rafaelfranca rafaelfranca authored
View
31 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
@@ -330,9 +330,38 @@ def json(name, options = {})
class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
include ColumnMethods
+ # Defines the primary key field.
+ # Use of the native PostgreSQL UUID type is supported, and can be used
+ # by defining your tables as such:
+ #
+ # create_table :stuffs, id: :uuid do |t|
+ # t.string :content
+ # t.timestamps
+ # end
+ #
+ # By default, this will use the +uuid_generate_v4()+ function from the
+ # +uuid-ossp+ extension, which MUST be enabled on your databse. To enable
+ # the +uuid-ossp+ extension, you can use the +enable_extension+ method in your
+ # migrations To use a UUID primary key without +uuid-ossp+ enabled, you can
+ # set the +:default+ option to nil:
+ #
+ # create_table :stuffs, id: false do |t|
+ # t.primary_key :id, :uuid, default: nil
+ # t.uuid :foo_id
+ # t.timestamps
+ # end
+ #
+ # You may also pass a different UUID generation function from +uuid-ossp+
+ # or another library.
+ #
+ # Note that setting the UUID primary key default value to +nil+
+ # will require you to assure that you always provide a UUID value
+ # before saving a record (as primary keys cannot be nil). This might be
+ # done via the SecureRandom.uuid method and a +before_save+ callback,
+ # for instance.
def primary_key(name, type = :primary_key, options = {})
return super unless type == :uuid
- options[:default] ||= 'uuid_generate_v4()'
+ options[:default] = options.fetch(:default, 'uuid_generate_v4()')
options[:primary_key] = true
column name, type, options
end
View
31 activerecord/test/cases/adapters/postgresql/uuid_test.rb
@@ -63,3 +63,34 @@ def test_schema_dumper_for_uuid_primary_key
assert_match /\bcreate_table "pg_uuids", id: :uuid\b/, schema.string
end
end
+
+class PostgresqlUUIDTestNilDefault < ActiveRecord::TestCase
+ class UUID < ActiveRecord::Base
+ self.table_name = 'pg_uuids'
+ end
+
+ def setup
+ @connection = ActiveRecord::Base.connection
+
+ @connection.reconnect!
+
+ @connection.transaction do
+ @connection.create_table('pg_uuids', id: false) do |t|
+ t.primary_key :id, :uuid, default: nil
+ t.string 'name'
+ end
+ end
+ end
+
+ def teardown
+ @connection.execute 'drop table if exists pg_uuids'
+ end
+
+ def test_id_allows_default_override_via_nil
+ col_desc = @connection.execute("SELECT pg_get_expr(d.adbin, d.adrelid) as default
+ FROM pg_attribute a
+ LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
+ WHERE a.attname='id' AND a.attrelid = 'pg_uuids'::regclass").first
+ assert_nil col_desc["default"]
+ end
+end
Please sign in to comment.
Something went wrong with that request. Please try again.