diff options
author | Chad Moone <chadmoone@gmail.com> | 2013-04-25 00:46:40 -0400 |
---|---|---|
committer | Chad Moone <chadmoone@gmail.com> | 2013-05-01 19:07:17 -0400 |
commit | 55c40c0ecec50936c439548b440216c62aa4ccbb (patch) | |
tree | 0bba0645be78bfa516f52af09140ba445970d641 /activerecord | |
parent | f7f8b7ccfc2fe61c0834041d2e211dd9dfdfbbc8 (diff) | |
download | rails-55c40c0ecec50936c439548b440216c62aa4ccbb.tar.gz rails-55c40c0ecec50936c439548b440216c62aa4ccbb.tar.bz2 rails-55c40c0ecec50936c439548b440216c62aa4ccbb.zip |
allow override of uuid_generate_v4() default by passing default: nil
without this, it's not possible to use UUID primary keys without uuid-ossp installed and activated
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb | 31 | ||||
-rw-r--r-- | activerecord/test/cases/adapters/postgresql/uuid_test.rb | 31 |
2 files changed, 61 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index bf403c3ae0..6040eeed00 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -330,9 +330,38 @@ module ActiveRecord 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 diff --git a/activerecord/test/cases/adapters/postgresql/uuid_test.rb b/activerecord/test/cases/adapters/postgresql/uuid_test.rb index c0c0e8898c..edf18cb7a7 100644 --- a/activerecord/test/cases/adapters/postgresql/uuid_test.rb +++ b/activerecord/test/cases/adapters/postgresql/uuid_test.rb @@ -51,3 +51,34 @@ class PostgresqlUUIDTest < ActiveRecord::TestCase assert_not_nil u.other_uuid 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 |