Class: ActiveRecord::Migrator
- Inherits:
-
Object
- Object
- ActiveRecord::Migrator
- Defined in:
- lib/active_record/migration.rb
Overview
:nodoc:
Class Method Summary collapse
- .current_version ⇒ Object
- .down(migrations_path, target_version = nil) ⇒ Object
- .get_all_versions ⇒ Object
- .migrate(migrations_path, target_version = nil) ⇒ Object
- .proper_table_name(name) ⇒ Object
- .rollback(migrations_path, steps = 1) ⇒ Object
- .run(direction, migrations_path, target_version) ⇒ Object
- .schema_migrations_table_name ⇒ Object
- .up(migrations_path, target_version = nil) ⇒ Object
Instance Method Summary collapse
- #current_migration ⇒ Object
- #current_version ⇒ Object
-
#initialize(direction, migrations_path, target_version = nil) ⇒ Migrator
constructor
A new instance of Migrator.
- #migrate ⇒ Object
- #migrated ⇒ Object
- #migrations ⇒ Object
- #pending_migrations ⇒ Object
- #run ⇒ Object
Constructor Details
#initialize(direction, migrations_path, target_version = nil) ⇒ Migrator
Returns a new instance of Migrator.
407 408 409 410 411 |
# File 'lib/active_record/migration.rb', line 407 def initialize(direction, migrations_path, target_version = nil) raise StandardError.new("This database does not yet support migrations") unless Base.connection.supports_migrations? Base.connection.initialize_schema_migrations_table @direction, @migrations_path, @target_version = direction, migrations_path, target_version end |
Class Method Details
.current_version ⇒ Object
392 393 394 395 396 397 398 399 |
# File 'lib/active_record/migration.rb', line 392 def current_version sm_table = schema_migrations_table_name if Base.connection.table_exists?(sm_table) get_all_versions.max || 0 else 0 end end |
.down(migrations_path, target_version = nil) ⇒ Object
376 377 378 |
# File 'lib/active_record/migration.rb', line 376 def down(migrations_path, target_version = nil) self.new(:down, migrations_path, target_version).migrate end |
.get_all_versions ⇒ Object
388 389 390 |
# File 'lib/active_record/migration.rb', line 388 def get_all_versions Base.connection.select_values("SELECT version FROM #{schema_migrations_table_name}").map(&:to_i).sort end |
.migrate(migrations_path, target_version = nil) ⇒ Object
354 355 356 357 358 359 360 |
# File 'lib/active_record/migration.rb', line 354 def migrate(migrations_path, target_version = nil) case when target_version.nil? then up(migrations_path, target_version) when current_version > target_version then down(migrations_path, target_version) else up(migrations_path, target_version) end end |
.proper_table_name(name) ⇒ Object
401 402 403 404 |
# File 'lib/active_record/migration.rb', line 401 def proper_table_name(name) # Use the Active Record objects own table_name, or pre/suffix from ActiveRecord::Base if name is a symbol/string name.table_name rescue "#{ActiveRecord::Base.table_name_prefix}#{name}#{ActiveRecord::Base.table_name_suffix}" end |
.rollback(migrations_path, steps = 1) ⇒ Object
362 363 364 365 366 367 368 369 370 |
# File 'lib/active_record/migration.rb', line 362 def rollback(migrations_path, steps=1) migrator = self.new(:down, migrations_path) start_index = migrator.migrations.index(migrator.current_migration) return unless start_index finish = migrator.migrations[start_index + steps] down(migrations_path, finish ? finish.version : 0) end |
.run(direction, migrations_path, target_version) ⇒ Object
380 381 382 |
# File 'lib/active_record/migration.rb', line 380 def run(direction, migrations_path, target_version) self.new(direction, migrations_path, target_version).run end |
.schema_migrations_table_name ⇒ Object
384 385 386 |
# File 'lib/active_record/migration.rb', line 384 def schema_migrations_table_name Base.table_name_prefix + 'schema_migrations' + Base.table_name_suffix end |
.up(migrations_path, target_version = nil) ⇒ Object
372 373 374 |
# File 'lib/active_record/migration.rb', line 372 def up(migrations_path, target_version = nil) self.new(:up, migrations_path, target_version).migrate end |
Instance Method Details
#current_migration ⇒ Object
417 418 419 |
# File 'lib/active_record/migration.rb', line 417 def current_migration migrations.detect { |m| m.version == current_version } end |
#current_version ⇒ Object
413 414 415 |
# File 'lib/active_record/migration.rb', line 413 def current_version migrated.last || 0 end |
#migrate ⇒ Object
430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 |
# File 'lib/active_record/migration.rb', line 430 def migrate current = migrations.detect { |m| m.version == current_version } target = migrations.detect { |m| m.version == @target_version } if target.nil? && !@target_version.nil? && @target_version > 0 raise UnknownMigrationVersionError.new(@target_version) end start = up? ? 0 : (migrations.index(current) || 0) finish = migrations.index(target) || migrations.size - 1 runnable = migrations[start..finish] # skip the last migration if we're headed down, but not ALL the way down runnable.pop if down? && !target.nil? runnable.each do |migration| Base.logger.info "Migrating to #{migration} (#{migration.version})" # On our way up, we skip migrating the ones we've already migrated # On our way down, we skip reverting the ones we've never migrated next if up? && migrated.include?(migration.version.to_i) if down? && !migrated.include?(migration.version.to_i) migration.announce 'never migrated, skipping'; migration.write else migration.migrate(@direction) (migration.version) end end end |
#migrated ⇒ Object
497 498 499 |
# File 'lib/active_record/migration.rb', line 497 def migrated @migrated_versions ||= self.class.get_all_versions end |
#migrations ⇒ Object
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 |
# File 'lib/active_record/migration.rb', line 461 def migrations @migrations ||= begin files = Dir["#{@migrations_path}/[0-9]*_*.rb"] migrations = files.inject([]) do |klasses, file| version, name = file.scan(/([0-9]+)_([_a-z0-9]*).rb/).first raise IllegalMigrationNameError.new(file) unless version version = version.to_i if klasses.detect { |m| m.version == version } raise DuplicateMigrationVersionError.new(version) end if klasses.detect { |m| m.name == name.camelize } raise DuplicateMigrationNameError.new(name.camelize) end load(file) klasses << returning(name.camelize.constantize) do |klass| class << klass; attr_accessor :version end klass.version = version end end migrations = migrations.sort_by(&:version) down? ? migrations.reverse : migrations end end |
#pending_migrations ⇒ Object
492 493 494 495 |
# File 'lib/active_record/migration.rb', line 492 def pending_migrations already_migrated = migrated migrations.reject { |m| already_migrated.include?(m.version.to_i) } end |
#run ⇒ Object
421 422 423 424 425 426 427 428 |
# File 'lib/active_record/migration.rb', line 421 def run target = migrations.detect { |m| m.version == @target_version } raise UnknownMigrationVersionError.new(@target_version) if target.nil? unless (up? && migrated.include?(target.version.to_i)) || (down? && !migrated.include?(target.version.to_i)) target.migrate(@direction) (target.version) end end |