diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index e1f543c3a15e88333969ddaa41e3cc2a42e8bdd6..48005eee1ad1d2974ce1961eb4a16a34578dfb03 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -7,8 +7,9 @@ * Add ability to default to `uuid` as primary key when generating database migrations - Set `Rails.application.config.active_record.primary_key = :uuid` - or `config.active_record.primary_key = :uuid` in config/application.rb + config.generators do |g| + g.orm :active_record, primary_key_type: :uuid + end *Jon McCartie* diff --git a/activerecord/lib/rails/generators/active_record/migration.rb b/activerecord/lib/rails/generators/active_record/migration.rb index b7418cf42fe3406bf7b55672dd73193fcd5199a0..c2b2209638c974042dcbf095197f9bb83aa46de4 100644 --- a/activerecord/lib/rails/generators/active_record/migration.rb +++ b/activerecord/lib/rails/generators/active_record/migration.rb @@ -13,6 +13,13 @@ def next_migration_number(dirname) ActiveRecord::Migration.next_migration_number(next_migration_number) end end + + private + + def primary_key_type + key_type = options[:primary_key_type] + ", id: :#{key_type}" if key_type + end end end end diff --git a/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb b/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb index 0d57de4d6511766a14e7002ffc3e5e394ad7e5ab..4e5872b585eec023d2e50fee247844f08e2b19fa 100644 --- a/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb +++ b/activerecord/lib/rails/generators/active_record/migration/migration_generator.rb @@ -5,6 +5,8 @@ module Generators # :nodoc: class MigrationGenerator < Base # :nodoc: argument :attributes, :type => :array, :default => [], :banner => "field[:type][:index] field[:type][:index]" + class_option :primary_key_type, type: :string, desc: "The type for primary key" + def create_migration_file set_local_assigns! validate_file_name! diff --git a/activerecord/lib/rails/generators/active_record/migration/templates/create_table_migration.rb b/activerecord/lib/rails/generators/active_record/migration/templates/create_table_migration.rb index 4a7deb3c754ebce76573b7cac94730144deb4957..fadab2a1e630cf0deec4440f371d643a3314a5ec 100644 --- a/activerecord/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +++ b/activerecord/lib/rails/generators/active_record/migration/templates/create_table_migration.rb @@ -1,6 +1,6 @@ class <%= migration_class_name %> < ActiveRecord::Migration def change - create_table :<%= table_name %><%= id_kind %> do |t| + create_table :<%= table_name %><%= primary_key_type %> do |t| <% attributes.each do |attribute| -%> <% if attribute.password_digest? -%> t.string :password_digest<%= attribute.inject_options %> diff --git a/activerecord/lib/rails/generators/active_record/model/model_generator.rb b/activerecord/lib/rails/generators/active_record/model/model_generator.rb index 7e8d68ce690816d6d510d402ac1d2d7eedeaee09..395951ac9d2e1956dfab79d4235f009f062f4fce 100644 --- a/activerecord/lib/rails/generators/active_record/model/model_generator.rb +++ b/activerecord/lib/rails/generators/active_record/model/model_generator.rb @@ -7,14 +7,13 @@ class ModelGenerator < Base # :nodoc: check_class_collision - class_option :migration, :type => :boolean - class_option :timestamps, :type => :boolean - class_option :parent, :type => :string, :desc => "The parent class for the generated model" - class_option :indexes, :type => :boolean, :default => true, :desc => "Add indexes for references and belongs_to columns" + class_option :migration, type: :boolean + class_option :timestamps, type: :boolean + class_option :parent, type: :string, desc: "The parent class for the generated model" + class_option :indexes, type: :boolean, default: true, desc: "Add indexes for references and belongs_to columns" + class_option :primary_key_type, type: :string, desc: "The type for primary key" - # creates the migration file for the model. - def create_migration_file return unless options[:migration] && options[:parent].nil? attributes.each { |a| a.attr_options.delete(:index) if a.reference? && !a.has_index? } if options[:indexes] == false diff --git a/railties/lib/rails/generators/migration.rb b/railties/lib/rails/generators/migration.rb index a755471a4b0576b2aa90c5247016ee4ab8ec0120..87f2e1d42b968d597fca24c548316ae5c6d31321 100644 --- a/railties/lib/rails/generators/migration.rb +++ b/railties/lib/rails/generators/migration.rb @@ -30,11 +30,6 @@ def next_migration_number(dirname) end end - def id_kind - kind = Rails.application.config.active_record.primary_key rescue nil - ", id: :#{kind}" if kind - end - def create_migration(destination, data, config = {}, &block) action Rails::Generators::Actions::CreateMigration.new(self, destination, block || data.to_s, config) end diff --git a/railties/test/generators/migration_generator_test.rb b/railties/test/generators/migration_generator_test.rb index a7f807b747f719804049f56d39cb43cfd410fd3e..199743a3964f70f8ed7c3ef88c2707b3d8e791df 100644 --- a/railties/test/generators/migration_generator_test.rb +++ b/railties/test/generators/migration_generator_test.rb @@ -222,16 +222,12 @@ def test_create_table_migration end def test_add_uuid_to_create_table_migration - previous_value = Rails.application.config.active_record.primary_key - Rails.application.config.active_record.primary_key = :uuid - run_generator ["create_books"] + run_generator ["create_books", "--primary_key_type=uuid"] assert_migration "db/migrate/create_books.rb" do |content| assert_method :change, content do |change| assert_match(/create_table :books, id: :uuid/, change) end end - - Rails.application.config.active_record.primary_key = previous_value end def test_should_create_empty_migrations_if_name_not_start_with_add_or_remove_or_create diff --git a/railties/test/generators/model_generator_test.rb b/railties/test/generators/model_generator_test.rb index abd3ff50a4379aff6c8bae7ce347ba654763aae6..64b9a480f38820d8087c1f5ab980ac3f42f55b86 100644 --- a/railties/test/generators/model_generator_test.rb +++ b/railties/test/generators/model_generator_test.rb @@ -374,6 +374,15 @@ def test_index_is_skipped_for_references_association end end + def test_add_uuid_to_create_table_migration + run_generator ["account", "--primary_key_type=uuid"] + assert_migration "db/migrate/create_accounts.rb" do |content| + assert_method :change, content do |change| + assert_match(/create_table :accounts, id: :uuid/, change) + end + end + end + def test_required_belongs_to_adds_required_association run_generator ["account", "supplier:references{required}"]