mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Raises when ActiveRecord::Migration
is inherited directly.
This commit is contained in:
parent
bc6c5df469
commit
249f71a22a
4 changed files with 35 additions and 54 deletions
|
@ -1,3 +1,7 @@
|
|||
* 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 @@ module ActiveRecord
|
|||
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 @@ module ActiveRecord
|
|||
|
||||
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 @@ module ActiveRecord
|
|||
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 @@ module ActiveRecord
|
|||
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 @@ module ActiveRecord
|
|||
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 @@ module ActiveRecord
|
|||
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 @@ module ActiveRecord
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue