модуль ActiveRecord::Persistence::ClassMethods
Публичные методы экземпляров
# File activerecord/lib/active_record/persistence.rb, line 31
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 48
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 162 def delete(id_or_array) where(primary_key => id_or_array).delete_all end
Удаляет строку с первичным ключом, соответствующим аргументу id, используя оператор SQL DELETE, и возвращает количество удалённых строк. Объекты Active Record не инициализируются, поэтому обратные вызовы объекта не выполняются, включая любые :dependent параметры ассоциаций.
Вы можете удалить несколько строк одновременно, передав массив id.
Примечание: Хотя это часто намного быстрее, чем альтернатива, destroy, пропуск обратных вызовов может обойти логику бизнес-процесса в вашем приложении, которая обеспечивает целостность ссылок или выполняет другие необходимые задачи.
Примеры
# Delete a single row Todo.delete(1) # Delete multiple rows Todo.delete([2,3,4])
# File activerecord/lib/active_record/persistence.rb, line 136
def destroy(id)
if id.is_a?(Array)
find(id).each(&:destroy)
else
find(id).destroy
end
end Уничтожает объект (или несколько объектов) с заданным id. Объект сначала инициализируется, поэтому все обратные вызовы и фильтры срабатывают перед удалением объекта. Этот метод менее эффективен, чем delete, но позволяет выполнять методы очистки и другие действия.
В сущности, этот метод находит объект (или несколько объектов) с заданным id, создаёт новый объект на основе атрибутов и затем вызывает destroy для него.
Параметры
-
id- Это должен быть id или массив id, которые должны быть уничтожены.
Примеры
# Destroy a single object Todo.destroy(1) # Destroy multiple objects todos = [1,2,3] Todo.destroy(todos)
# File activerecord/lib/active_record/persistence.rb, line 68
def instantiate(attributes, column_types = {}, &block)
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, &block)
end На основе словаря атрибутов, instantiate возвращает новый экземпляр соответствующего класса. Принимает только ключи в виде строк.
Например, Post.all может вернуть Комментарии, Сообщения и Письма, храня подкласс записи в атрибуте type. Вызывая instantiate вместо new, методы поиска гарантируют, что они получают новые экземпляры соответствующего класса для каждой записи.
См. ActiveRecord::Inheritance#discriminate_class_for_record чтобы увидеть, как реализуется эта система наследования «в одной таблице».
# File activerecord/lib/active_record/persistence.rb, line 100
def update(id, attributes)
if id.is_a?(Array)
id.map { |one_id| find(one_id) }.each_with_index { |object, idx|
object.update(attributes[idx])
}
else
if ActiveRecord::Base === id
raise ArgumentError,
"You are passing an instance of ActiveRecord::Base to `update`. " \
"Please pass the id of the object by calling `.id`."
end
object = find(id)
object.update(attributes)
object
end
end Обновляет объект (или несколько объектов) и сохраняет его в базе данных, если проверки валидации пройдены. Результирующий объект возвращается, независимо от успешного сохранения объекта в базе данных.
Параметры
-
id- Это должен быть id или массив id, которые должны быть обновлены. -
attributes- Это должен быть словарь атрибутов или массив словарей.
Примеры
# Updates one record
Person.update(15, user_name: "Samuel", group: "expert")
# Updates multiple records
people = { 1 => { "first_name" => "David" }, 2 => { "first_name" => "Jeremy" } }
Person.update(people.keys, people.values)
# Updates multiple records from the result of a relation
people = Person.where(group: "expert")
people.update(group: "masters")
Примечание: Обновление большого количества записей будет выполнять запрос UPDATE для каждой записи, что может привести к проблемам производительности. Когда обратные вызовы не нужны для каждого обновления записи, предпочтительнее использовать update_all для обновления всех записей в одном запросе.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.