модуль ActiveRecord::ModelSchema::ClassMethods
Открытые методы экземпляров
Возвращает хэш, где ключи — имена столбцов, а значения — значения по умолчанию при создании объекта 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 Возвращает массив имён столбцов в виде строк.
# File activerecord/lib/active_record/model_schema.rb, line 259
def column_names
@column_names ||= columns.map { |column| column.name }
end Возвращает массив объектов столбцов для таблицы, связанной с этим классом.
# 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 Возвращает хэш объектов столбцов для таблицы, связанной с этим классом.
# File activerecord/lib/active_record/model_schema.rb, line 222
def columns_hash
@columns_hash ||= Hash[columns.map { |c| [c.name, c] }]
end Возвращает массив объектов столбцов, из которого удалены первичный идентификатор, все столбцы, заканчивающиеся на «_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 Определяет имя столбца таблицы, который будет хранить имя класса в ситуациях наследования по одной таблице.
Имя столбца наследования по умолчанию — 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
# File activerecord/lib/active_record/model_schema.rb, line 170 def inheritance_column=(value) @inheritance_column = value.to_s @explicit_inheritance_column = true end
Возвращает цитированную версию имени таблицы, используемую для построения 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
Сбрасывает всю кэшированную информацию о столбцах, что заставит их перезагрузиться при следующем запросе.
Наиболее распространенный шаблон использования этого метода, вероятно, в миграции, когда сразу после создания таблицы вы хотите заполнить её некоторыми значениями по умолчанию, например:
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
# 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 Устанавливает имя последовательности, которое используется при генерации идентификаторов, заданному значению, или (если значение равно 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
Указывает, существует ли таблица, связанная с этим классом
# File activerecord/lib/active_record/model_schema.rb, line 208 def table_exists? connection.schema_cache.table_exists?(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"
# File activerecord/lib/active_record/model_schema.rb, line 108 def table_name reset_table_name unless defined?(@table_name) @table_name end
Явно устанавливает имя таблицы. Пример:
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.