Spec-Zone.ru › Ruby on Rails 4.2

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

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

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

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

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

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

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

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

inheritance_column() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 186
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 191
def inheritance_column=(value)
  @inheritance_column = value.to_s
  @explicit_inheritance_column = true
end

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

quoted_table_name() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 154
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 295
def reset_column_information
  connection.clear_cache!
  undefine_attribute_methods
  connection.schema_cache.clear_table_cache!(table_name)

  @arel_engine        = nil
  @column_names       = nil
  @column_types       = nil
  @content_columns    = nil
  @default_attributes = nil
  @inheritance_column = nil unless defined?(@explicit_inheritance_column) && @explicit_inheritance_column
  @relation           = nil

  initialize_find_by_cache
end

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

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

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
sequence_name() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 196
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 223
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 229
def table_exists?
  connection.schema_cache.table_exists?(table_name)
end

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

table_name() Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 125
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, чтобы определить своё вычисление. (Возможно, используя super для изменения имени таблицы по умолчанию.) Пример:

class Post < ActiveRecord::Base
  def self.table_name
    "special_" + super
  end
end
Post.table_name # => "special_posts"
table_name=(value) Показать исходный код
# File activerecord/lib/active_record/model_schema.rb, line 138
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

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

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

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

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

Spec-Zone.ru

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