123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::ConnectionAdapters::MySQL::AlterTable

Do not use. This class is for internal use only.
Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: ActiveRecord::ConnectionAdapters::AlterTable
Defined in: activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb

Overview

Active Record MySQL Adapter Alter Table

Constant Summary

::ActiveRecord::ConnectionAdapters::AlterTable - Inherited

COMBINABLE_COMMANDS

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

This class inherits a constructor from ActiveRecord::ConnectionAdapters::AlterTable

Instance Attribute Details

#algorithm (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 122

attr_reader :algorithm, :lock

#algorithm=(value) (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 124

def algorithm=(value)
  @algorithm = @td.conn.index_algorithm(value) if value
end

#lock (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 122

attr_reader :algorithm, :lock

#lock=(value) (rw)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 128

def lock=(value)
  @lock = @td.conn.lock_clause(value) if value
end

Instance Method Details

#add_column(column_name, type, **options)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 132

def add_column(column_name, type, **options)
  extract_algorithm_and_lock!(options)
  super
end

#add_index(column_name, **options)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 147

def add_index(column_name, **options)
  extract_algorithm_and_lock!(options)
  index, _ = @td.conn.add_index_options(name, column_name, **options)
  @operations << AddIndex.new(index)
end

#change_column(column_name, type, **options)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 159

def change_column(column_name, type, **options)
  extract_algorithm_and_lock!(options)
  conn = @td.conn
  column = conn.send(:column_for, name, column_name)
  type ||= column.sql_type

  unless options.key?(:default)
    options[:default] = if column.default_function
      #=> { column.default_function }
    else
      column.default
    end
  end

  unless options.key?(:null)
    options[:null] = column.null
  end

  unless options.key?(:comment)
    options[:comment] = column.comment
  end

  if options[:collation] == :no_collation
    options.delete(:collation)
  else
    options[:collation] ||= column.collation if conn.send(:text_type?, type)
  end

  unless options.key?(:auto_increment)
    options[:auto_increment] = column.auto_increment?
  end

  cd = @td.new_column_definition(column.name, type, **options)
  @operations << ChangeColumnDefinition.new(cd, column.name)
end

#extract_algorithm_and_lock!(options) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 215

def extract_algorithm_and_lock!(options)
  self.algorithm = options.delete(:algorithm)
  self.lock = options.delete(:lock)
end

#remove_column(column_name, _type = nil, **options)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 137

def remove_column(column_name, _type = nil, **options)
  extract_algorithm_and_lock!(options)
  # MySQL rejects `DROP COLUMN` on a column referenced by a foreign key,
  # so drop the FK in the same `ALTER TABLE` statement as the column.
  if fk = @td.conn.send(:foreign_key_for, name, column: column_name)
    @operations << DropForeignKey.new(fk.name)
  end
  super
end

#remove_index(column_name = nil, **options)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 153

def remove_index(column_name = nil, **options)
  extract_algorithm_and_lock!(options)
  index_name = @td.conn.send(:index_name_for_remove, name, column_name, options)
  @operations << DropIndex.new(index_name)
end

#rename_column(from_name, to_name, **options)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/mysql/schema_definitions.rb', line 195

def rename_column(from_name, to_name, **options)
  extract_algorithm_and_lock!(options)
  conn = @td.conn
  if conn.send(:supports_rename_column?)
    super(from_name, to_name)
  else
    column = conn.send(:column_for, name, from_name)
    column_options = {
      default: column.default,
      null: column.null,
      auto_increment: column.auto_increment?,
      comment: column.comment
    }
    current_type = conn.query_one("SHOW COLUMNS FROM #{conn.quote_table_name(name)} LIKE #{conn.quote(from_name)}")["Type"]
    cd = @td.new_column_definition(to_name, current_type, **column_options)
    @operations << ChangeColumnDefinition.new(cd, column.name)
  end
end