Module | ActiveRecord::ConnectionAdapters::SchemaStatements |
In: |
lib/active_record/connection_adapters/abstract/schema_statements.rb
|
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.
add_index(:suppliers, :name)
generates
CREATE INDEX suppliers_name_index ON suppliers(name)
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)
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)
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
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.
add_timestamps(:suppliers)
Changes the column‘s definition according to the new options. See TableDefinition#column for details of the options you can use.
change_column(:suppliers, :name, :string, :limit => 80) change_column(:accounts, :description, :text)
Sets a new default value for a column.
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.
# 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:
Defaults to false.
change_table(:suppliers) do |t| t.column :name, :string, :limit => 60 end
change_table(:suppliers) do |t| t.integer :width, :height, :null => false, :default => 0 end
change_table(:suppliers) do |t| t.timestamps end
change_table(:suppliers) do |t| t.references :company end
Creates a company_id(integer) column
change_table(:suppliers) do |t| t.belongs_to :company, :polymorphic => true end
Creates company_type(varchar) and company_id(integer) columns
change_table(:suppliers) do |t| t.remove :company end
change_table(:suppliers) do |t| t.remove :company_id t.remove :width, :height end
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.
# 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:
# 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
# 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
# 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:
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.
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
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) )
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")
Checks to see if an index exists on a table for a given index definition.
# 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.
remove_column(:suppliers, :qualification) remove_columns(:suppliers, :qualification, :experience)
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.
remove_timestamps(:suppliers)
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'
Returns a string of CREATE TABLE SQL statement(s) for recreating the entire structure of the database.