Spec-Zone.ru › Ruby on Rails 4.1

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

Открытые методы экземпляров

column_defaults() Показать исходный код

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

# File activerecord/lib/active_record/model_schema.rb, line 254
def column_defaults
  @column_defaults ||= Hash[columns.map { |c| [c.name, c.default] }]
end
column_names() Показать исходный код

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

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

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

# File activerecord/lib/active_record/model_schema.rb, line 213
def columns
  @columns ||= connection.schema_cache.columns(table_name).map do |col|
    col = col.dup
    col.primary = (col.name == primary_key)
    col
  end
end
columns_hash() Показать исходный код

Возвращает хэш объектов столбцов для таблицы, связанной с этим классом.

# File activerecord/lib/active_record/model_schema.rb, line 222
def columns_hash
  @columns_hash ||= Hash[columns.map { |c| [c.name, c] }]
end
content_columns() Показать исходный код

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

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

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

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

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

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

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

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

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

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

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

class CreateJobLevels < ActiveRecord::Migration
  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
# File activerecord/lib/active_record/model_schema.rb, line 295
def reset_column_information
  connection.clear_cache!
  undefine_attribute_methods
  connection.schema_cache.clear_table_cache!(table_name) if table_exists?

  @arel_engine             = nil
  @column_defaults         = nil
  @column_names            = nil
  @columns                 = nil
  @columns_hash            = nil
  @column_types            = nil
  @content_columns         = nil
  @dynamic_methods_hash    = nil
  @inheritance_column      = nil unless defined?(@explicit_inheritance_column) && @explicit_inheritance_column
  @relation                = nil
  @serialized_column_names = nil
  @time_zone_column_names  = nil
  @cached_time_zone        = nil
end
sequence_name() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 175
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) Показать исходный код

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

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

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

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

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

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

Предполагает имя таблицы (в принудительно нижнем регистре) на основе имени класса в иерархии наследования, непосредственно унаследованной от 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, чтобы определить свою собственную вычисление. (Возможно, используя super для изменения имени таблицы по умолчанию). Пример:

class Post < ActiveRecord::Base
  def self.table_name
    "special_" + super
  end
end
Post.table_name # => "special_posts"
# File activerecord/lib/active_record/model_schema.rb, line 108
def table_name
  reset_table_name unless defined?(@table_name)
  @table_name
end
table_name=(value) Показать исходный код

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

class Project < ActiveRecord::Base
  self.table_name = "project"
end

Вы также можете просто определить свой собственный метод self.table_name; см. документацию для ActiveRecord::Base#table_name.

# File activerecord/lib/active_record/model_schema.rb, line 121
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
  @relation          = Relation.create(self, arel_table)
end

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

Spec-Zone.ru

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