Class: ActiveRecord::ConnectionAdapters::TableDefinition
- Inherits:
-
Object
- Object
- ActiveRecord::ConnectionAdapters::TableDefinition
- Includes:
- ColumnMethods
- Defined in:
- lib/active_record/connection_adapters/abstract/schema_definitions.rb
Overview
Active Record Connection Adapters Table Definition
Represents the schema of an SQL table in an abstract way. This class provides methods for manipulating the schema representation.
Inside migration files, the t
object in create_table is actually of this type:
class SomeMigration < ActiveRecord::Migration[7.2]
def up
create_table :foo do |t|
puts t.class # => "ActiveRecord::ConnectionAdapters::TableDefinition"
end
end
def down
...
end
end
Direct Known Subclasses
MySQL::TableDefinition, PostgreSQL::TableDefinition, SQLite3::TableDefinition
Instance Attribute Summary collapse
-
#as ⇒ Object
readonly
Returns the value of attribute as.
-
#check_constraints ⇒ Object
readonly
Returns the value of attribute check_constraints.
-
#comment ⇒ Object
readonly
Returns the value of attribute comment.
-
#foreign_keys ⇒ Object
readonly
Returns the value of attribute foreign_keys.
-
#if_not_exists ⇒ Object
readonly
Returns the value of attribute if_not_exists.
-
#indexes ⇒ Object
readonly
Returns the value of attribute indexes.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#temporary ⇒ Object
readonly
Returns the value of attribute temporary.
Instance Method Summary collapse
-
#[](name) ⇒ Object
Returns a ColumnDefinition for the column with name
name
. - #check_constraint(expression, **options) ⇒ Object
-
#column(name, type, index: nil, **options) ⇒ Object
Instantiates a new column for the table.
-
#columns ⇒ Object
Returns an array of ColumnDefinition objects for the columns of the table.
- #foreign_key(to_table, **options) ⇒ Object
-
#index(column_name, **options) ⇒ Object
Adds index options to the indexes hash, keyed by column name This is primarily used to track indexes that need to be created after the table.
-
#initialize(conn, name, temporary: false, if_not_exists: false, options: nil, as: nil, comment: nil) ⇒ TableDefinition
constructor
A new instance of TableDefinition.
-
#new_check_constraint_definition(expression, options) ⇒ Object
:nodoc:.
-
#new_column_definition(name, type, **options) ⇒ Object
:nodoc:.
-
#new_foreign_key_definition(to_table, options) ⇒ Object
:nodoc:.
-
#primary_keys(name = nil) ⇒ Object
:nodoc:.
-
#references(*args, **options) ⇒ Object
(also: #belongs_to)
Adds a reference.
-
#remove_column(name) ⇒ Object
remove the column
name
from the table. - #set_primary_key(table_name, id, primary_key, **options) ⇒ Object
-
#timestamps(**options) ⇒ Object
Appends
:datetime
columns:created_at
and:updated_at
to the table.
Methods included from ColumnMethods
Constructor Details
#initialize(conn, name, temporary: false, if_not_exists: false, options: nil, as: nil, comment: nil) ⇒ TableDefinition
Returns a new instance of TableDefinition.
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 368 def initialize( conn, name, temporary: false, if_not_exists: false, options: nil, as: nil, comment: nil, ** ) @conn = conn @columns_hash = {} @indexes = [] @foreign_keys = [] @primary_keys = nil @check_constraints = [] @temporary = temporary @if_not_exists = if_not_exists @options = @as = as @name = name @comment = comment end |
Instance Attribute Details
#as ⇒ Object (readonly)
Returns the value of attribute as.
366 367 368 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 366 def as @as end |
#check_constraints ⇒ Object (readonly)
Returns the value of attribute check_constraints.
366 367 368 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 366 def check_constraints @check_constraints end |
#comment ⇒ Object (readonly)
Returns the value of attribute comment.
366 367 368 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 366 def comment @comment end |
#foreign_keys ⇒ Object (readonly)
Returns the value of attribute foreign_keys.
366 367 368 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 366 def foreign_keys @foreign_keys end |
#if_not_exists ⇒ Object (readonly)
Returns the value of attribute if_not_exists.
366 367 368 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 366 def if_not_exists @if_not_exists end |
#indexes ⇒ Object (readonly)
Returns the value of attribute indexes.
366 367 368 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 366 def indexes @indexes end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
366 367 368 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 366 def name @name end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
366 367 368 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 366 def @options end |
#temporary ⇒ Object (readonly)
Returns the value of attribute temporary.
366 367 368 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 366 def temporary @temporary end |
Instance Method Details
#[](name) ⇒ Object
Returns a ColumnDefinition for the column with name name
.
418 419 420 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 418 def [](name) @columns_hash[name.to_s] end |
#check_constraint(expression, **options) ⇒ Object
522 523 524 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 522 def check_constraint(expression, **) check_constraints << new_check_constraint_definition(expression, ) end |
#column(name, type, index: nil, **options) ⇒ Object
Instantiates a new column for the table. See connection.add_column for available options.
Additional options are:
-
:index
- Create an index for the column. Can be eithertrue
or an options hash.
This method returns self
.
Examples
# Assuming +td+ is an instance of TableDefinition
td.column(:granted, :boolean, index: true)
Short-hand examples
Instead of calling #column directly, you can also work with the short-hand definitions for the default types. They use the type as the method name instead of as a parameter and allow for multiple columns to be defined in a single statement.
What can be written like this with the regular calls to column:
create_table :products do |t|
t.column :shop_id, :integer
t.column :creator_id, :integer
t.column :item_number, :string
t.column :name, :string, default: "Untitled"
t.column :value, :string, default: "Untitled"
t.column :created_at, :datetime
t.column :updated_at, :datetime
end
add_index :products, :item_number
can also be written as follows using the short-hand:
create_table :products do |t|
t.integer :shop_id, :creator_id
t.string :item_number, index: true
t.string :name, :value, default: "Untitled"
t. null: false
end
There’s a short-hand method for each of the type values declared at the top. And then there’s TableDefinition#timestamps that’ll add created_at
and updated_at
as datetimes.
TableDefinition#references will add an appropriately-named _id column, plus a corresponding _type column if the :polymorphic
option is supplied. If :polymorphic
is a hash of options, these will be used when creating the _type
column. The :index
option will also create an index, similar to calling add_index. So what can be written like this:
create_table :taggings do |t|
t.integer :tag_id, :tagger_id, :taggable_id
t.string :tagger_type
t.string :taggable_type, default: 'Photo'
end
add_index :taggings, :tag_id, name: 'index_taggings_on_tag_id'
add_index :taggings, [:tagger_id, :tagger_type]
Can also be written as follows using references:
create_table :taggings do |t|
t.references :tag, index: { name: 'index_taggings_on_tag_id' }
t.references :tagger, polymorphic: true
t.references :taggable, polymorphic: { default: 'Photo' }, index: false
end
489 490 491 492 493 494 495 496 497 498 499 500 501 502 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 489 def column(name, type, index: nil, **) name = name.to_s type = type.to_sym if type raise_on_duplicate_column(name) @columns_hash[name] = new_column_definition(name, type, **) if index = index.is_a?(Hash) ? index : {} index(name, **) end self end |
#columns ⇒ Object
Returns an array of ColumnDefinition objects for the columns of the table.
415 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 415 def columns; @columns_hash.values; end |
#foreign_key(to_table, **options) ⇒ Object
518 519 520 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 518 def foreign_key(to_table, **) foreign_keys << new_foreign_key_definition(to_table, ) end |
#index(column_name, **options) ⇒ Object
Adds index options to the indexes hash, keyed by column name This is primarily used to track indexes that need to be created after the table
index(:account_id, name: 'index_projects_on_account_id')
514 515 516 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 514 def index(column_name, **) indexes << [column_name, ] end |
#new_check_constraint_definition(expression, options) ⇒ Object
:nodoc:
580 581 582 583 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 580 def new_check_constraint_definition(expression, ) # :nodoc: = @conn.(name, expression, ) CheckConstraintDefinition.new(name, expression, ) end |
#new_column_definition(name, type, **options) ⇒ Object
:nodoc:
555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 555 def new_column_definition(name, type, **) # :nodoc: if integer_like_primary_key?(type, ) type = integer_like_primary_key_type(type, ) end type = aliased_types(type.to_s, type) if @conn.supports_datetime_with_precision? if type == :datetime && !.key?(:precision) [:precision] = 6 end end [:primary_key] ||= type == :primary_key [:null] = false if [:primary_key] create_column_definition(name, type, ) end |
#new_foreign_key_definition(to_table, options) ⇒ Object
:nodoc:
572 573 574 575 576 577 578 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 572 def new_foreign_key_definition(to_table, ) # :nodoc: prefix = ActiveRecord::Base.table_name_prefix suffix = ActiveRecord::Base.table_name_suffix to_table = "#{prefix}#{to_table}#{suffix}" = @conn.(name, to_table, ) ForeignKeyDefinition.new(name, to_table, ) end |
#primary_keys(name = nil) ⇒ Object
:nodoc:
409 410 411 412 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 409 def primary_keys(name = nil) # :nodoc: @primary_keys = PrimaryKeyDefinition.new(name) if name @primary_keys end |
#references(*args, **options) ⇒ Object Also known as: belongs_to
Adds a reference.
t.references(:user)
t.belongs_to(:supplier, foreign_key: true)
t.belongs_to(:supplier, foreign_key: true, type: :integer)
See connection.add_reference for details of the options you can use.
548 549 550 551 552 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 548 def references(*args, **) args.each do |ref_name| ReferenceDefinition.new(ref_name, **).add_to(self) end end |
#remove_column(name) ⇒ Object
remove the column name
from the table.
remove_column(:account_id)
506 507 508 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 506 def remove_column(name) @columns_hash.delete name.to_s end |
#set_primary_key(table_name, id, primary_key, **options) ⇒ Object
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 392 def set_primary_key(table_name, id, primary_key, **) if id && !as pk = primary_key || Base.get_primary_key(table_name.to_s.singularize) if id.is_a?(Hash) .merge!(id.except(:type)) id = id.fetch(:type, :primary_key) end if pk.is_a?(Array) primary_keys(pk) else primary_key(pk, id, **) end end end |
#timestamps(**options) ⇒ Object
Appends :datetime
columns :created_at
and :updated_at
to the table. See connection.add_timestamps
t. null: false
530 531 532 533 534 535 536 537 538 539 |
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 530 def (**) [:null] = false if [:null].nil? if !.key?(:precision) && @conn.supports_datetime_with_precision? [:precision] = 6 end column(:created_at, :datetime, **) column(:updated_at, :datetime, **) end |