модуль ActiveRecord::Persistence::ClassMethods
Публичные методы экземпляров
# 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 Создаёт объект (или несколько объектов) и сохраняет его (их) в базу данных, если валидация пройдена. Результирующий объект возвращается, вне зависимости от успешного сохранения в базе данных.
Параметр 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 46
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 Создаёт объект (или несколько объектов) и сохраняет его (их) в базу данных, если валидация пройдена. Вызывает исключение RecordInvalid, если валидация не пройдена, в отличие от Base#create.
Параметр attributes может быть либо словарём, либо массивом словарей. Они описывают атрибуты, которые будут созданы на объекте или нескольких объектах, если передан массив словарей.
# File activerecord/lib/active_record/persistence.rb, line 66
def instantiate(attributes, column_types = {})
klass = discriminate_class_for_record(attributes)
attributes = klass.attributes_builder.build_from_database(attributes, column_types)
klass.allocate.init_with('attributes' => attributes, 'new_record' => false)
end Принимая во внимание словарь атрибутов, instantiate возвращает новый экземпляр соответствующего класса. Принимает только ключи как строки.
Например, Post.all может возвращать Comments, Messages и Emails, храня подкласс записи в атрибуте type. Вызывая instantiate вместо new, методы поиска гарантируют, что они получают новые экземпляры соответствующего класса для каждой записи.
См. +ActiveRecord::Inheritance#discriminate_class_for_record+, чтобы увидеть, как реализована эта “однотабличная” наследование.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.