Module ActiveRecord::ConnectionAdapters::SchemaStatements
In: lib/active_record/connection_adapters/abstract/schema_statements.rb

Methods

Public Instance methods

Adds a new column to the named table. See TableDefinition#column for details of the options you can use.

Adds a new index to the table. column_name can be a single Symbol, or an Array of Symbols.

The index will be named after the table and the column name(s), unless you pass :name as an option.

Examples
Creating a simple index
 add_index(:suppliers, :name)

generates

 CREATE INDEX suppliers_name_index ON suppliers(name)
Creating a unique index
 add_index(:accounts, [:branch_id, :party_id], :unique => true)

generates

 CREATE UNIQUE INDEX accounts_branch_id_party_id_index ON accounts(branch_id, party_id)
Creating a named index
 add_index(:accounts, [:branch_id, :party_id], :unique => true, :name => 'by_branch_party')

generates

 CREATE UNIQUE INDEX by_branch_party ON accounts(branch_id, party_id)
Creating an index with specific key length
 add_index(:accounts, :name, :name => 'by_name', :length => 10)

generates

 CREATE INDEX by_name ON accounts(name(10))

 add_index(:accounts, [:name, :surname], :name => 'by_name_surname', :length => {:name => 10, :surname => 15})

generates

 CREATE INDEX by_name_surname ON accounts(name(10), surname(15))

Note: SQLite doesn‘t support index length

Creating an index with a sort order (desc or asc, asc is the default)
 add_index(:accounts, [:branch_id, :party_id, :surname], :order => {:branch_id => :desc, :part_id => :asc})

generates

 CREATE INDEX by_branch_desc_party ON accounts(branch_id DESC, party_id ASC, surname)

Note: mysql doesn‘t yet support index order (it accepts the syntax but ignores it)

Adds timestamps (created_at and updated_at) columns to the named table.

Examples
 add_timestamps(:suppliers)

Changes the column‘s definition according to the new options. See TableDefinition#column for details of the options you can use.

Examples
 change_column(:suppliers, :name, :string, :limit => 80)
 change_column(:accounts, :description, :text)

Sets a new default value for a column.

Examples
 change_column_default(:suppliers, :qualification, 'new')
 change_column_default(:accounts, :authorized, 1)
 change_column_default(:users, :email, nil)

A block for changing columns in table.

Example

 # change_table() yields a Table instance
 change_table(:suppliers) do |t|
   t.column :name, :string, :limit => 60
   # Other column alterations here
 end

The options hash can include the following keys:

:bulk
Set this to true to make this a bulk alter query, such as ALTER TABLE `users` ADD COLUMN age INT(11), ADD COLUMN birthdate DATETIME …

Defaults to false.

Examples
Add a column
 change_table(:suppliers) do |t|
   t.column :name, :string, :limit => 60
 end
Add 2 integer columns
 change_table(:suppliers) do |t|
   t.integer :width, :height, :null => false, :default => 0
 end
Add created_at/updated_at columns
 change_table(:suppliers) do |t|
   t.timestamps
 end
Add a foreign key column
 change_table(:suppliers) do |t|
   t.references :company
 end

Creates a company_id(integer) column

Add a polymorphic foreign key column
 change_table(:suppliers) do |t|
   t.belongs_to :company, :polymorphic => true
 end

Creates company_type(varchar) and company_id(integer) columns

Remove a column
 change_table(:suppliers) do |t|
   t.remove :company
 end
Remove several columns
 change_table(:suppliers) do |t|
   t.remove :company_id
   t.remove :width, :height
 end
Remove an index
 change_table(:suppliers) do |t|
   t.remove_index :company_id
 end

See also Table for details on all of the various column transformation

Checks to see if a column exists in a given table.

Examples

 # Check a column exists
 column_exists?(:suppliers, :name)

 # Check a column exists of a particular type
 column_exists?(:suppliers, :name, :string)

 # Check a column exists with a specific definition
 column_exists?(:suppliers, :name, :string, :limit => 100)

Returns an array of Column objects for the table specified by table_name. See the concrete implementation for details on the expected parameter values.

Creates a new table with the name table_name. table_name may either be a String or a Symbol.

There are two ways to work with create_table. You can use the block form or the regular form, like this:

Block form

 # create_table() passes a TableDefinition object to the block.
 # This form will not only create the table, but also columns for the
 # table.

 create_table(:suppliers) do |t|
   t.column :name, :string, :limit => 60
   # Other fields here
 end

Block form, with shorthand

 # You can also use the column types as method calls, rather than calling the column method.
 create_table(:suppliers) do |t|
   t.string :name, :limit => 60
   # Other fields here
 end

Regular form

 # Creates a table called 'suppliers' with no columns.
 create_table(:suppliers)
 # Add a column to 'suppliers'.
 add_column(:suppliers, :name, :string, {:limit => 60})

The options hash can include the following keys:

:id
Whether to automatically add a primary key column. Defaults to true. Join tables for has_and_belongs_to_many should set it to false.
:primary_key
The name of the primary key, if one is to be added automatically. Defaults to id. If :id is false this option is ignored.

Also note that this just sets the primary key in the table. You additionally need to configure the primary key in the model via +self.primary_key=+. Models do NOT auto-detect the primary key from their table definition.

:options
Any extra options you want appended to the table definition.
:temporary
Make a temporary table.
:force
Set to true to drop the table before creating it. Defaults to false.
Examples
Add a backend specific option to the generated SQL (MySQL)
 create_table(:suppliers, :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8')

generates:

 CREATE TABLE suppliers (
   id int(11) DEFAULT NULL auto_increment PRIMARY KEY
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
Rename the primary key column
 create_table(:objects, :primary_key => 'guid') do |t|
   t.column :name, :string, :limit => 80
 end

generates:

 CREATE TABLE objects (
   guid int(11) DEFAULT NULL auto_increment PRIMARY KEY,
   name varchar(80)
 )
Do not add a primary key column
 create_table(:categories_suppliers, :id => false) do |t|
   t.column :category_id, :integer
   t.column :supplier_id, :integer
 end

generates:

 CREATE TABLE categories_suppliers (
   category_id int,
   supplier_id int
 )

See also TableDefinition#column for details on how to create columns.

SELECT DISTINCT clause for a given set of columns and a given ORDER BY clause. Both PostgreSQL and Oracle overrides this for custom DISTINCT syntax.

  distinct("posts.id", "posts.created_at desc")

Drops a table from the database.

Checks to see if an index exists on a table for a given index definition.

Examples

 # Check an index exists
 index_exists?(:suppliers, :company_id)

 # Check an index on multiple columns exists
 index_exists?(:suppliers, [:company_id, :company_type])

 # Check a unique index exists
 index_exists?(:suppliers, :company_id, :unique => true)

 # Check an index with a custom name exists
 index_exists?(:suppliers, :company_id, :name => "idx_company_id"

Verify the existence of an index with a given name.

The default argument is returned if the underlying implementation does not define the indexes method, as there‘s no way to determine the correct answer in that case.

Should not be called normally, but this operation is non-destructive. The migrations module handles this automatically.

Returns a Hash of mappings from the abstract data types to the native database types. See TableDefinition#column for details on the recognized abstract data types.

Removes the column(s) from the table definition.

Examples
 remove_column(:suppliers, :qualification)
 remove_columns(:suppliers, :qualification, :experience)
remove_columns(table_name, *column_names)

Alias for remove_column

Remove the given index from the table.

Remove the index_accounts_on_column in the accounts table.

  remove_index :accounts, :column

Remove the index named index_accounts_on_branch_id in the accounts table.

  remove_index :accounts, :column => :branch_id

Remove the index named index_accounts_on_branch_id_and_party_id in the accounts table.

  remove_index :accounts, :column => [:branch_id, :party_id]

Remove the index named by_branch_party in the accounts table.

  remove_index :accounts, :name => :by_branch_party

Removes the timestamp columns (created_at and updated_at) from the table definition.

Examples
 remove_timestamps(:suppliers)

Renames a column.

Example
 rename_column(:suppliers, :description, :name)

Rename an index.

Rename the index_people_on_last_name index to index_users_on_last_name

  rename_index :people, 'index_people_on_last_name', 'index_users_on_last_name'

Renames a table.

Example
 rename_table('octopuses', 'octopi')

Returns a string of CREATE TABLE SQL statement(s) for recreating the entire structure of the database.

Truncates a table alias according to the limits of the current adapter.

Checks to see if the table table_name exists on the database.

Example

  table_exists?(:developers)

Protected Instance methods

Overridden by the mysql adapter for supporting index lengths

[Validate]