class ActiveRecord::ConnectionAdapters::TableDefinition
Active Record Connection Adapters Таблица определений
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 Атрибуты
Общедоступные методы класса
# File activerecord/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 = options
@as = as
@name = name
@comment = comment
end Общедоступные методы экземпляров
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 418 def [](name) @columns_hash[name.to_s] end
Возвращает ColumnDefinition для столбца с именем name.
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 522 def check_constraint(expression, **options) check_constraints << new_check_constraint_definition(expression, options) end
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 489
def column(name, type, index: nil, **options)
name = name.to_s
type = type.to_sym if type
raise_on_duplicate_column(name)
@columns_hash[name] = new_column_definition(name, type, **options)
if index
index_options = index.is_a?(Hash) ? index : {}
index(name, **index_options)
end
self
end Создаёт новый столбец для таблицы. См. connection.add_column для доступных опций.
Дополнительные опции:
-
:index- Создать индекс для столбца. Может быть либоtrue, либо хеш опций.
Этот метод возвращает self.
Примеры
# Assuming +td+ is an instance of TableDefinition td.column(:granted, :boolean, index: true)
Примеры сокращенной записи
Вместо вызова column напрямую, вы также можете использовать сокращенные определения для стандартных типов. Они используют имя типа как имя метода вместо параметра и позволяют определять несколько столбцов в одном операторе.
То, что можно записать так с обычными вызовами 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
также можно записать следующим образом, используя сокращенную запись:
create_table :products do |t| t.integer :shop_id, :creator_id t.string :item_number, index: true t.string :name, :value, default: "Untitled" t.timestamps null: false end
Для каждого из типов, объявленных вверху, есть метод сокращенной записи. А также есть TableDefinition#timestamps, который добавит created_at и updated_at как даты и время.
TableDefinition#references добавит столбец с соответствующим именем _id, а также столбец _type, если задан параметр :polymorphic . Если :polymorphic является хешем опций, они будут использоваться при создании столбца _type . Параметр :index также создаст индекс, аналогично вызову add_index. Таким образом, то, что можно записать так:
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]
Также можно записать следующим образом, используя 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
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 415 def columns; @columns_hash.values; end
Возвращает массив объектов ColumnDefinition для столбцов таблицы.
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 518 def foreign_key(to_table, **options) foreign_keys << new_foreign_key_definition(to_table, options) end
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 514 def index(column_name, **options) indexes << [column_name, options] end
Добавляет опции индекса в хеш индексов, с ключом имя столбца. Используется в основном для отслеживания индексов, которые нужно создать после таблицы.
index(:account_id, name: 'index_projects_on_account_id')
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 548
def references(*args, **options)
args.each do |ref_name|
ReferenceDefinition.new(ref_name, **options).add_to(self)
end
end Добавляет ссылку.
t.references(:user) t.belongs_to(:supplier, foreign_key: true) t.belongs_to(:supplier, foreign_key: true, type: :integer)
См. connection.add_reference для получения подробной информации об опциях, которые вы можете использовать.
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 506 def remove_column(name) @columns_hash.delete name.to_s end
Удалить столбец name из таблицы.
remove_column(:account_id)
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 392
def set_primary_key(table_name, id, primary_key, **options)
if id && !as
pk = primary_key || Base.get_primary_key(table_name.to_s.singularize)
if id.is_a?(Hash)
options.merge!(id.except(:type))
id = id.fetch(:type, :primary_key)
end
if pk.is_a?(Array)
primary_keys(pk)
else
primary_key(pk, id, **options)
end
end
end # File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 530
def timestamps(**options)
options[:null] = false if options[:null].nil?
if !options.key?(:precision) && @conn.supports_datetime_with_precision?
options[:precision] = 6
end
column(:created_at, :datetime, **options)
column(:updated_at, :datetime, **options)
end Добавляет столбцы :datetime :created_at и :updated_at в таблицу. См. connection.add_timestamps
t.timestamps null: false
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.