Skip to Content Skip to Search

MigrationContext sets the context in which a migration is run.

A migration context requires the path to the migrations is set in the migrations_paths parameter. Optionally a schema_migration class can be provided. Multiple database applications will instantiate a SchemaMigration object per database. From the Rake tasks, Rails will handle this for you.

Methods
M
N

Attributes

[R] internal_metadata
[R] migrations_paths
[R] schema_migration

Class Public methods

new(migrations_paths, schema_migration = nil, internal_metadata = nil)

# File activerecord/lib/active_record/migration.rb, line 1117
    def initialize(migrations_paths, schema_migration = nil, internal_metadata = nil)
      if schema_migration == SchemaMigration
        ActiveRecord.deprecator.warn(<<-MSG.squish)
          SchemaMigration no longer inherits from ActiveRecord::Base. If you want
          to use the default connection, remove this argument. If you want to use a
          specific connection, instaniate MigrationContext with the connection's schema
          migration, for example `MigrationContext.new(path, Dog.connection.schema_migration)`.
        MSG

        schema_migration = nil
      end

      if internal_metadata == InternalMetadata
        ActiveRecord.deprecator.warn(<<-MSG.squish)
          SchemaMigration no longer inherits from ActiveRecord::Base. If you want
          to use the default connection, remove this argument. If you want to use a
          specific connection, instaniate MigrationContext with the connection's internal
          metadata, for example `MigrationContext.new(path, nil, Dog.connection.internal_metadata)`.
        MSG

        internal_metadata = nil
      end

      @migrations_paths = migrations_paths
      @schema_migration = schema_migration || SchemaMigration.new(ActiveRecord::Base.connection)
      @internal_metadata = internal_metadata || InternalMetadata.new(ActiveRecord::Base.connection)
    end

Instance Public methods

migrate(target_version = nil, &block)

Runs the migrations in the migrations_path.

If target_version is nil, migrate will run up.

If the current_version and target_version are both 0 then an empty array will be returned and no migrations will be run.

If the current_version in the schema is greater than the target_version, then down will be run.

If none of the conditions are met, up will be run with the target_version.

# File activerecord/lib/active_record/migration.rb, line 1158
def migrate(target_version = nil, &block)
  case
  when target_version.nil?
    up(target_version, &block)
  when current_version == 0 && target_version == 0
    []
  when current_version > target_version
    down(target_version, &block)
  else
    up(target_version, &block)
  end
end