Class: ActiveRecord::Schema

Inherits:
Migration::Current show all
Defined in:
activerecord/lib/active_record/schema.rb

Overview

Active Record Schema

Allows programmers to programmatically define a schema in a portable DSL. This means you can define tables, indexes, etc. without using SQL directly, so your applications can more easily support multiple databases.

Usage:

ActiveRecord::Schema.define do
  create_table :authors do |t|
    t.string :name, null: false
  end

  add_index :authors, :name, :unique

  create_table :posts do |t|
    t.integer :author_id, null: false
    t.string :subject
    t.text :body
    t.boolean :private, default: false
  end

  add_index :posts, :author_id
end

ActiveRecord::Schema is only supported by database adapters that also support migrations, the two features being very similar.

Constant Summary

Constants inherited from Migration

Migration::MigrationFilenameRegexp

Instance Attribute Summary

Attributes inherited from Migration

#name, #version

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Migration

[], #announce, check_pending!, #connection, #copy, current_version, #disable_ddl_transaction, disable_ddl_transaction!, #down, #exec_migration, inherited, #initialize, load_schema_if_pending!, maintain_test_schema!, method_missing, #method_missing, migrate, #migrate, nearest_delegate, #next_migration_number, #proper_table_name, #reversible, #revert, #reverting?, #run, #say, #say_with_time, #suppress_messages, #table_name_options, #up, #up_only, #write

Constructor Details

This class inherits a constructor from ActiveRecord::Migration

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class ActiveRecord::Migration

Class Method Details

.define(info = {}, &block) ⇒ Object

Eval the given block. All methods available to the current connection adapter are available within the block, so you can easily use the database definition DSL to build up your schema ( create_table, add_index, etc.).

The info hash is optional, and if given is used to define metadata about the current schema (currently, only the schema’s version):

ActiveRecord::Schema.define(version: 2038_01_19_000001) do
  ...
end


45
46
47
# File 'activerecord/lib/active_record/schema.rb', line 45

def self.define(info = {}, &block)
  new.define(info, &block)
end

Instance Method Details

#define(info, &block) ⇒ Object

:nodoc:



49
50
51
52
53
54
55
56
57
58
59
# File 'activerecord/lib/active_record/schema.rb', line 49

def define(info, &block) # :nodoc:
  instance_eval(&block)

  if info[:version].present?
    connection.schema_migration.create_table
    connection.assume_migrated_upto_version(info[:version])
  end

  ActiveRecord::InternalMetadata.create_table
  ActiveRecord::InternalMetadata[:environment] = connection.migration_context.current_environment
end