Spec-Zone.ru › Ruby on Rails 5.0

модуль ActiveRecord::ModelSchema::ClassMethods

Публичные методы экземпляров

column_defaults() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 378
def column_defaults
  load_schema
  _default_attributes.to_hash
end

Возвращает хеш, где ключи — имена столбцов, а значения — значения по умолчанию при создании объекта Active Record для этой таблицы.

column_names() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 388
def column_names
  @column_names ||= columns.map(&:name)
end

Возвращает массив имён столбцов в виде строк.

columns() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 347
def columns
  load_schema
  @columns ||= columns_hash.values
end
content_columns() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 394
def content_columns
  @content_columns ||= columns.reject { |c| c.name == primary_key || c.name =~ /(_id|_count)$/ || c.name == inheritance_column }
end

Возвращает массив объектов столбцов, из которых удалены первичный идентификатор, все столбцы, заканчивающиеся на «_id» или «_count», а также столбцы, используемые для наследования по одной таблице.

ignored_columns() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 271
def ignored_columns
  if defined?(@ignored_columns)
    @ignored_columns
  else
    superclass.ignored_columns
  end
end

Список имён столбцов, которые модель должна игнорировать. Для игнорируемых столбцов не будут определены аксессоры атрибутов, и они не будут использоваться в запросах SQL.

ignored_columns=(columns) Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 281
def ignored_columns=(columns)
  @ignored_columns = columns.map(&:to_s)
end

Устанавливает имена столбцов, которые модель должна игнорировать. Для игнорируемых столбцов не будут определены аксессоры атрибутов, и они не будут использоваться в запросах SQL.

inheritance_column() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 259
def inheritance_column
  (@inheritance_column ||= nil) || superclass.inheritance_column
end

Определяет имя столбца таблицы, который будет хранить имя класса в ситуациях наследования по одной таблице.

Имя столбца наследования по умолчанию — type, что означает, что это зарезервированное слово внутри Active Record. Чтобы использовать наследование по одной таблице с другим именем столбца или использовать столбец type в вашей собственной модели для чего-то другого, вы можете установить inheritance_column:

self.inheritance_column = 'zoink'
inheritance_column=(value) Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 264
def inheritance_column=(value)
  @inheritance_column = value.to_s
  @explicit_inheritance_column = true
end

Устанавливает значение #inheritance_column

next_sequence_value() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 325
def next_sequence_value
  connection.next_sequence_value(sequence_name)
end

Возвращает следующее значение, которое будет использоваться в качестве первичного ключа в операторе вставки.

prefetch_primary_key?() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 319
def prefetch_primary_key?
  connection.prefetch_primary_key?(table_name)
end

Определяет, должны ли значения первичного ключа выбираться из соответствующей последовательности перед оператором вставки.

quoted_table_name() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 227
def quoted_table_name
  @quoted_table_name ||= connection.quote_table_name(table_name)
end

Возвращает цитированную версию имени таблицы, используемую для построения операторов SQL.

reset_column_information() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 424
def reset_column_information
  connection.clear_cache!
  undefine_attribute_methods
  connection.schema_cache.clear_data_source_cache!(table_name)

  reload_schema_from_cache
  initialize_find_by_cache
end

Сбрасывает все кэшированные сведения о столбцах, что приведет к их повторной загрузке при следующем запросе.

Наиболее распространённая схема использования этого метода, вероятно, в миграции, когда сразу после создания таблицы вы хотите заполнить её значениями по умолчанию, например:

class CreateJobLevels < ActiveRecord::Migration[5.0]
  def up
    create_table :job_levels do |t|
      t.integer :id
      t.string :name

      t.timestamps
    end

    JobLevel.reset_column_information
    %w{assistant executive manager director}.each do |type|
      JobLevel.create(name: type)
    end
  end

  def down
    drop_table :job_levels
  end
end
sequence_name() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 285
def sequence_name
  if base_class == self
    @sequence_name ||= reset_sequence_name
  else
    (@sequence_name ||= nil) || base_class.sequence_name
  end
end
sequence_name=(value) Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 312
def sequence_name=(value)
  @sequence_name          = value.to_s
  @explicit_sequence_name = true
end

Устанавливает имя последовательности для генерации идентификаторов заданному значению или (если значение равно nil или false) значению, возвращаемому заданным блоком. Это необходимо для Oracle и полезно для баз данных, которые полагаются на последовательности для генерации первичных ключей.

Если имя последовательности не задано явно при использовании Oracle, по умолчанию оно будет соответствовать общепринятому шаблону: #{table_name}_seq

Если имя последовательности не задано явно при использовании PostgreSQL, оно будет обнаружено для вашего первичного ключа.

class Project < ActiveRecord::Base
  self.sequence_name = "projectseq"   # default would have been "project_seq"
end
table_exists?() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 330
def table_exists?
  connection.schema_cache.data_source_exists?(table_name)
end

Указывает, существует ли таблица, связанная с этим классом.

table_name() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 201
def table_name
  reset_table_name unless defined?(@table_name)
  @table_name
end

Предполагает имя таблицы (в принудительно строчных буквах) на основе имени класса в иерархии наследования, непосредственно унаследованной от ActiveRecord::Base. Таким образом, если иерархия выглядит так: Reply < Message < ActiveRecord::Base, то Message используется для определения имени таблицы, даже если она вызвана из Reply. Правила, используемые для определения имени, обрабатываются классом Inflector в Active Support, который знает почти все общие английские склонения. Вы можете добавить новые склонения в config/initializers/inflections.rb.

Вложенным классам даются имена таблиц, префикс которых — единственное число имени родительской таблицы. Вложенные модули не учитываются.

Примеры

class Invoice < ActiveRecord::Base
end

file                  class               table_name
invoice.rb            Invoice             invoices

class Invoice < ActiveRecord::Base
  class Lineitem < ActiveRecord::Base
  end
end

file                  class               table_name
invoice.rb            Invoice::Lineitem   invoice_lineitems

module Invoice
  class Lineitem < ActiveRecord::Base
  end
end

file                  class               table_name
invoice/lineitem.rb   Invoice::Lineitem   lineitems

Кроме того, к имени класса добавляется префикс уровня класса table_name_prefix, а также суффикс table_name_suffix. Таким образом, если у вас есть префикс «myapp_», то предполагаемое имя таблицы для класса Invoice становится «myapp_invoices». Invoice::Lineitem становится «myapp_invoice_lineitems».

Вы также можете явно установить своё имя таблицы:

class Mouse < ActiveRecord::Base
  self.table_name = "mice"
end
table_name=(value) Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 211
def table_name=(value)
  value = value && value.to_s

  if defined?(@table_name)
    return if value == @table_name
    reset_column_information if connected?
  end

  @table_name        = value
  @quoted_table_name = nil
  @arel_table        = nil
  @sequence_name     = nil unless defined?(@explicit_sequence_name) && @explicit_sequence_name
  @predicate_builder = nil
end

Явно устанавливает имя таблицы. Пример:

class Project < ActiveRecord::Base
  self.table_name = "project"
end
type_for_attribute(attr_name, &block) Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 368
def type_for_attribute(attr_name, &block)
  if block
    attribute_types.fetch(attr_name, &block)
  else
    attribute_types[attr_name]
  end
end

Возвращает тип атрибута с заданным именем после применения всех модификаторов. Этот метод — единственный допустимый источник информации о типах атрибутов модели. Этот метод обращается к базе данных и загружает схему модели, если это необходимо.

Возвращаемое значение этого метода будет реализовывать интерфейс, описанный в ActiveModel::Type::Value (хотя сам объект может его не наследовать).

attr_name Имя атрибута, для которого нужно получить тип. Должно быть строкой.

Защищённые методы экземпляров

initialize_load_schema_monitor() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 435
def initialize_load_schema_monitor
  @load_schema_monitor = Monitor.new
end

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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