модуль ActiveRecord::Persistence::ClassMethods
Методы публичного экземпляра
Создает объект (или несколько объектов) и сохраняет его в базе данных, если валидация пройдена. Результирующий объект возвращается, независимо от того, был ли объект успешно сохранен в базе данных или нет.
Параметр attributes может быть либо словарём, либо массивом словарей. Эти словари описывают атрибуты объектов, которые должны быть созданы.
Примеры
# Create a single new object
User.create(first_name: 'Jamie')
# Create an Array of new objects
User.create([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }])
# Create a single object and pass it into a block to set other attributes.
User.create(first_name: 'Jamie') do |u|
u.is_admin = false
end
# Creating an Array of new objects using a block, where the block is executed for each object:
User.create([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }]) do |u|
u.is_admin = false
end
# File activerecord/lib/active_record/persistence.rb, line 29
def create(attributes = nil, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| create(attr, &block) }
else
object = new(attributes, &block)
object.save
object
end
end Получив словарь атрибутов, instantiate возвращает новый экземпляр соответствующего класса. Принимает только ключи как строки.
Например, Post.all может вернуть Comments, Messages и Emails, сохраняя подкласс записи в атрибуте type. Вызывая instantiate вместо new, методы поиска гарантируют получение новых экземпляров соответствующего класса для каждой записи.
См. +ActiveRecord::Inheritance#discriminate_class_for_record+, чтобы увидеть, как реализовано отображение «единой таблицы» наследования.
# File activerecord/lib/active_record/persistence.rb, line 49
def instantiate(attributes, column_types = {})
klass = discriminate_class_for_record(attributes)
column_types = klass.decorate_columns(column_types.dup)
klass.allocate.init_with('attributes' => attributes, 'column_types' => column_types)
end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.