Spec-Zone.ru › Ruby on Rails 7.2

class ActiveRecord::ConnectionAdapters::TableDefinition

Parent:
Object
Included modules:
ActiveRecord::ConnectionAdapters::ColumnMethods

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

Атрибуты

as[R]
check_constraints[R]
comment[R]
foreign_keys[R]
if_not_exists[R]
indexes[R]
name[R]
options[R]
temporary[R]

Общедоступные методы класса

new( conn, name, temporary: false, if_not_exists: false, options: nil, as: nil, comment: nil, ** ) Показать исходный код
# 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

Общедоступные методы экземпляров

[](name) Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 418
def [](name)
  @columns_hash[name.to_s]
end

Возвращает ColumnDefinition для столбца с именем name.

belongs_to(*args, **options)
Псевдоним для: references
check_constraint(expression, **options) Показать исходный код
# 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
column(name, type, index: nil, **options) Показать исходный код
# 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
columns() Показать исходный код
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 415
def columns; @columns_hash.values; end

Возвращает массив объектов ColumnDefinition для столбцов таблицы.

foreign_key(to_table, **options) Показать исходный код
# 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
index(column_name, **options) Показать исходный код
# 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')
references(*args, **options) Показать исходный код
# 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 для получения подробной информации об опциях, которые вы можете использовать.

Также является псевдонимом для: belongs_to
remove_column(name) Показать исходный код
# 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)
set_primary_key(table_name, id, primary_key, **options) Показать исходный код
# 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
timestamps(**options) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API