модуль ActiveRecord::ModelSchema::ClassMethods
Открытые методы экземпляров
# File activerecord/lib/active_record/model_schema.rb, line 249 def column_defaults _default_attributes.dup.to_hash end
Возвращает хеш, где ключи — имена столбцов, а значения — значения по умолчанию при создании объекта AR для этой таблицы.
# 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 265
def content_columns
@content_columns ||= columns.reject { |c| c.name == primary_key || c.name =~ /(_id|_count)$/ || c.name == inheritance_column }
end Возвращает массив объектов столбцов, из которого удалены первичный идентификатор, все столбцы, оканчивающиеся на «_id» или «_count», и столбцы, используемые для наследования по одной таблице.
# 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'
# 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
# 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-запросов.
# 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
# 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 # 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
# File activerecord/lib/active_record/model_schema.rb, line 229 def table_exists? connection.schema_cache.table_exists?(table_name) end
Указывает, существует ли таблица, связанная с этим классом
# 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"
# 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.