123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::SchemaMigration

Do not use. This class is for internal use only.
Relationships & Source Files
Namespace Children
Classes:
Inherits: Object
Defined in: activerecord/lib/active_record/schema_migration.rb

Overview

This class is used to create a table that keeps track of which migrations have been applied to a given database. When a migration is run, its schema number is inserted in to the schema migrations table so it doesn’t need to be executed the next time.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(connection) ⇒ SchemaMigration

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 14

def initialize(connection)
  @connection = connection
  @arel_table = Arel::Table.new(table_name)
end

Instance Attribute Details

#arel_table (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 12

attr_reader :connection, :arel_table

#connection (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 12

attr_reader :connection, :arel_table

#table_exists?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 85

def table_exists?
  connection.data_source_exists?(table_name)
end

Instance Method Details

#count

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 78

def count
  sm = Arel::SelectManager.new(arel_table)
  sm.project(*Arel::Nodes::Count.new([Arel.star]))

  connection.select_values(sm, "#{self.class} Count").first
end

#create_table

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 46

def create_table
  unless connection.table_exists?(table_name)
    connection.create_table(table_name, id: false) do |t|
      t.string :version, **connection.internal_string_options_for_primary_key
    end
  end
end

#create_version(version)

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 19

def create_version(version)
  im = Arel::InsertManager.new(arel_table)
  im.insert(arel_table[primary_key] => version)
  connection.insert(im, "#{self.class} Create", primary_key, version)
end

#delete_all_versions

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 32

def delete_all_versions
  versions.each do |version|
    delete_version(version)
  end
end

#delete_version(version)

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 25

def delete_version(version)
  dm = Arel::DeleteManager.new(arel_table)
  dm.wheres = [arel_table[primary_key].eq(version)]

  connection.delete(dm, "#{self.class} Destroy")
end

#drop_table

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 54

def drop_table
  connection.drop_table table_name, if_exists: true
end

#integer_versions

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 74

def integer_versions
  versions.map(&:to_i)
end

#normalize_migration_number(number)

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 58

def normalize_migration_number(number)
  "%.3d" % number.to_i
end

#normalized_versions

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 62

def normalized_versions
  versions.map { |v| normalize_migration_number v }
end

#primary_key

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 38

def primary_key
  "version"
end

#table_name

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 42

def table_name
  "#{ActiveRecord::Base.table_name_prefix}#{ActiveRecord::Base.schema_migrations_table_name}#{ActiveRecord::Base.table_name_suffix}"
end

#versions

[ GitHub ]

  
# File 'activerecord/lib/active_record/schema_migration.rb', line 66

def versions
  sm = Arel::SelectManager.new(arel_table)
  sm.project(arel_table[primary_key])
  sm.order(arel_table[primary_key].asc)

  connection.select_values(sm, "#{self.class} Load")
end