From 972d18eab56459368365b70d005c158700317cf3 Mon Sep 17 00:00:00 2001 From: hotatekaoru Date: Tue, 5 May 2020 11:32:38 +0900 Subject: [PATCH] Add `change_null` for `change_table` To change a NOT NULL constraint `reversible`. When changing a NOT NULL constraint, we use `ActiveRecord::ConnectionAdapters::SchemaStatements#change` method that is not reversible, so `up` and `down` methods were required. Actually, we can use `change_column_null` method if only one constraint changed, but if we want to change multiple constarints with ALTER QUERY, `up` and `down` methods were required. --- .../abstract/schema_definitions.rb | 11 +++++++++++ .../test/cases/migration/change_table_test.rb | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb index 597cb1cd2f..a84e13344b 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb @@ -496,6 +496,7 @@ def add_column(name, type, **options) # t.timestamps # t.change # t.change_default + # t.change_null # t.rename # t.references # t.belongs_to @@ -615,6 +616,16 @@ def change_default(column_name, default_or_changes) @base.change_column_default(name, column_name, default_or_changes) end + # Sets or removes a NOT NULL constraint on a column. + # + # t.change_null(:qualification, true) + # t.change_null(:qualification, false, 0) + # + # See {connection.change_column_null}[rdoc-ref:SchemaStatements#change_column_null] + def change_null(column_name, null, default = nil) + @base.change_column_null(name, column_name, null, default) + end + # Removes the column(s) from the table definition. # # t.remove(:qualification) diff --git a/activerecord/test/cases/migration/change_table_test.rb b/activerecord/test/cases/migration/change_table_test.rb index 5a691b4ac3..370f3f3d54 100644 --- a/activerecord/test/cases/migration/change_table_test.rb +++ b/activerecord/test/cases/migration/change_table_test.rb @@ -281,6 +281,13 @@ def test_change_default_changes_column end end + def test_change_null_changes_column + with_change_table do |t| + @connection.expect :change_column_null, nil, [:delete_me, :bar, true, nil] + t.change_null :bar, true + end + end + def test_remove_drops_single_column with_change_table do |t| if RUBY_VERSION < "2.7" -- GitLab