Raises when `ActiveRecord::Migration` is inherited directly.

上级 bc6c5df4
* Raises when `ActiveRecord::Migration` is inherited directly.
*Rafael Mendonça França*
* Remove deprecated `original_exception` argument in `ActiveRecord::StatementInvalid#initialize`
and `ActiveRecord::StatementInvalid#original_exception`.
......
......@@ -522,7 +522,10 @@ class Current < Migration # :nodoc:
def self.inherited(subclass) # :nodoc:
super
if subclass.superclass == Migration
subclass.include Compatibility::Legacy
raise StandardError, "Directly inheriting from ActiveRecord::Migration is not supported. " \
"Please specify the Rails release the migration was written for:\n" \
"\n" \
" class #{self.class.name} < ActiveRecord::Migration[4.2]"
end
end
......
......@@ -13,7 +13,27 @@ def self.find(version)
V5_1 = Current
module FourTwoShared
class V5_0 < V5_1
def create_table(table_name, options = {})
if adapter_name == "PostgreSQL"
if options[:id] == :uuid && !options[:default]
options[:default] = "uuid_generate_v4()"
end
end
# Since 5.1 Postgres adapter uses bigserial type for primary
# keys by default and MySQL uses bigint. This compat layer makes old migrations utilize
# serial/int type instead -- the way it used to work before 5.1.
if options[:id].blank?
options[:id] = :integer
options[:auto_increment] = true
end
super
end
end
class V4_2 < V5_0
module TableDefinition
def references(*, **options)
options[:index] ||= false
......@@ -101,46 +121,6 @@ def index_name_for_remove(table_name, options = {})
index_name
end
end
class V5_0 < V5_1
def create_table(table_name, options = {})
if adapter_name == "PostgreSQL"
if options[:id] == :uuid && !options[:default]
options[:default] = "uuid_generate_v4()"
end
end
# Since 5.1 Postgres adapter uses bigserial type for primary
# keys by default and MySQL uses bigint. This compat layer makes old migrations utilize
# serial/int type instead -- the way it used to work before 5.1.
if options[:id].blank?
options[:id] = :integer
options[:auto_increment] = true
end
super
end
end
class V4_2 < V5_0
# 4.2 is defined as a module because it needs to be shared with
# Legacy. When the time comes, V5_0 should be defined straight
# in its class.
include FourTwoShared
end
module Legacy
include FourTwoShared
def migrate(*)
ActiveSupport::Deprecation.warn \
"Directly inheriting from ActiveRecord::Migration is deprecated. " \
"Please specify the Rails release the migration was written for:\n" \
"\n" \
" class #{self.class.name} < ActiveRecord::Migration[4.2]"
super
end
end
end
end
end
......@@ -55,7 +55,7 @@ def migrate(x)
end
def test_references_does_not_add_index_by_default
migration = Class.new(ActiveRecord::Migration) {
migration = Class.new(ActiveRecord::Migration[4.2]) {
def migrate(x)
create_table :more_testings do |t|
t.references :foo
......@@ -73,7 +73,7 @@ def migrate(x)
end
def test_timestamps_have_null_constraints_if_not_present_in_migration_of_create_table
migration = Class.new(ActiveRecord::Migration) {
migration = Class.new(ActiveRecord::Migration[4.2]) {
def migrate(x)
create_table :more_testings do |t|
t.timestamps
......@@ -90,7 +90,7 @@ def migrate(x)
end
def test_timestamps_have_null_constraints_if_not_present_in_migration_for_adding_timestamps_to_existing_table
migration = Class.new(ActiveRecord::Migration) {
migration = Class.new(ActiveRecord::Migration[4.2]) {
def migrate(x)
add_timestamps :testings
end
......@@ -102,15 +102,9 @@ def migrate(x)
assert connection.columns(:testings).find { |c| c.name == "updated_at" }.null
end
def test_legacy_migrations_get_deprecation_warning_when_run
migration = Class.new(ActiveRecord::Migration) {
def up
add_column :testings, :baz, :string
end
}
assert_deprecated do
migration.migrate :up
def test_legacy_migrations_raises_exception_when_inherited
assert_raises(StandardError) do
Class.new(ActiveRecord::Migration)
end
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册