Spec-Zone.ru › Ruby on Rails 6.0

модуль ActiveRecord::Persistence::ClassMethods

Публичные методы экземпляров

create(attributes = nil, &block) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 33
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
create!(attributes = nil, &block) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 50
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 может быть либо хэшем, либо массивом хэшей. Они описывают атрибуты создаваемого объекта или нескольких объектов, если передан массив хэшей.

delete(id_or_array) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 351
def delete(id_or_array)
  delete_by(primary_key => id_or_array)
end

Удаляет строку с первичным ключом, соответствующим аргументу id, используя SQL DELETE выражение, и возвращает количество удалённых строк. Объекты Active Record не создаются, поэтому обратные вызовы объекта не выполняются, включая любые :dependent параметры ассоциации.

Вы можете удалить несколько строк одновременно, передав массив id.

Примечание: Хотя это часто намного быстрее, чем альтернативный метод destroy, пропуск обратных вызовов может обойти бизнес-логику вашего приложения, которая обеспечивает целостность ссылок или выполняет другие важные задачи.

Примеры

# Delete a single row
Todo.delete(1)

# Delete multiple rows
Todo.delete([2,3,4])
destroy(id) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 325
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)
insert(attributes, returning: nil, unique_by: nil) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 66
def insert(attributes, returning: nil, unique_by: nil)
  insert_all([ attributes ], returning: returning, unique_by: unique_by)
end

Вставляет одну запись в базу данных в одном SQL операторе INSERT. Не создаёт модели и не запускает обратные вызовы или валидации Active Record. Хотя переданные значения проходят типизацию и сериализацию Active Record.

См. ActiveRecord::Persistence#insert_all для документации.

insert!(attributes, returning: nil) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 133
def insert!(attributes, returning: nil)
  insert_all!([ attributes ], returning: returning)
end

Вставляет одну запись в базу данных в одном SQL операторе INSERT. Не создаёт модели и не запускает обратные вызовы или валидации Active Record. Хотя переданные значения проходят типизацию и сериализацию Active Record.

См. ActiveRecord::Persistence#insert_all! для дополнительной информации.

insert_all(attributes, returning: nil, unique_by: nil) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 123
def insert_all(attributes, returning: nil, unique_by: nil)
  InsertAll.new(self, attributes, on_duplicate: :skip, returning: returning, unique_by: unique_by).execute
end

Вставляет несколько записей в базу данных в одном SQL операторе INSERT. Не создаёт модели и не запускает обратные вызовы или валидации Active Record. Хотя переданные значения проходят типизацию и сериализацию Active Record.

Параметр attributes — это массив хэшей. Каждый хэш определяет атрибуты для одной строки и должен иметь одинаковые ключи.

Строки считаются уникальными по каждому уникальному индексу в таблице. Любые повторяющиеся строки пропускаются. Переопределите с помощью :unique_by (см. ниже).

Возвращает ActiveRecord::Result, содержащий данные на основе :returning (см. ниже).

Параметры

:returning

(Только PostgreSQL) Массив атрибутов для возврата всех успешно вставленных записей, по умолчанию — первичный ключ. Передайте returning: %w[ id name ] для id и name или returning: false для пропуска подлежащего RETURNING SQL фрагмента полностью.

:unique_by

(Только PostgreSQL и SQLite) По умолчанию строки считаются уникальными по каждому уникальному индексу в таблице. Любые повторяющиеся строки пропускаются.

Чтобы пропустить строки в соответствии с только одним уникальным индексом, передайте :unique_by.

Рассмотрим модель Book, где дублирование ISBN не имеет смысла, но если у любой строки есть существующий id или она не уникальна по другому уникальному индексу, то будет выброшено исключение ActiveRecord::RecordNotUnique.

Уникальные индексы можно идентифицировать по столбцам или имени:

unique_by: :isbn
unique_by: %i[ author_id name ]
unique_by: :index_books_on_isbn

Так как он опирается на информацию об индексе из базы данных, :unique_by рекомендуется использовать в паре с кэшем схемы Active Record.

Пример

# Insert records and skip inserting any duplicates.
# Here "Eloquent Ruby" is skipped because its id is not unique.

Book.insert_all([
  { id: 1, title: "Rework", author: "David" },
  { id: 1, title: "Eloquent Ruby", author: "Russ" }
])
insert_all!(attributes, returning: nil) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 177
def insert_all!(attributes, returning: nil)
  InsertAll.new(self, attributes, on_duplicate: :raise, returning: returning).execute
end

Вставляет несколько записей в базу данных в одном SQL операторе INSERT. Не создаёт модели и не запускает обратные вызовы или валидации Active Record. Хотя переданные значения проходят типизацию и сериализацию Active Record.

Параметр attributes — это массив хэшей. Каждый хэш определяет атрибуты для одной строки и должен иметь одинаковые ключи.

Вызывает ActiveRecord::RecordNotUnique если какие-либо строки нарушают уникальный индекс в таблице. В этом случае ни одна строка не вставляется.

Чтобы пропустить повторяющиеся строки, см. ActiveRecord::Persistence#insert_all. Чтобы заменить их, см. ActiveRecord::Persistence#upsert_all.

Возвращает ActiveRecord::Result, содержащий данные на основе :returning (см. ниже).

Параметры

:returning

(Только PostgreSQL) Массив атрибутов для возврата всех успешно вставленных записей, по умолчанию — первичный ключ. Передайте returning: %w[ id name ] для id и name или returning: false для пропуска подлежащего RETURNING SQL фрагмента полностью.

Примеры

# Insert multiple records
Book.insert_all!([
  { title: "Rework", author: "David" },
  { title: "Eloquent Ruby", author: "Russ" }
])

# Raises ActiveRecord::RecordNotUnique because "Eloquent Ruby"
# does not have a unique id.
Book.insert_all!([
  { id: 1, title: "Rework", author: "David" },
  { id: 1, title: "Eloquent Ruby", author: "Russ" }
])
instantiate(attributes, column_types = {}, &block) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 256
def instantiate(attributes, column_types = {}, &block)
  klass = discriminate_class_for_record(attributes)
  instantiate_instance_of(klass, attributes, column_types, &block)
end

Принимая хэш атрибутов, instantiate возвращает новый экземпляр соответствующего класса. Принимает только ключи в виде строк.

Например, Post.all может вернуть Comments, Messages и Emails, сохраняя подкласс записи в атрибуте type. Вызывая instantiate вместо new, методы поиска гарантируют получение новых экземпляров соответствующего класса для каждой записи.

См. ActiveRecord::Inheritance#discriminate_class_for_record чтобы узнать, как реализуется это отображение «единой таблицы» наследования.

update(id = :all, attributes) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 287
def update(id = :all, attributes)
  if id.is_a?(Array)
    id.map { |one_id| find(one_id) }.each_with_index { |object, idx|
      object.update(attributes[idx])
    }
  elsif id == :all
    all.each { |record| record.update(attributes) }
  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 для обновления всех записей в одном запросе.

upsert(attributes, returning: nil, unique_by: nil) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 187
def upsert(attributes, returning: nil, unique_by: nil)
  upsert_all([ attributes ], returning: returning, unique_by: unique_by)
end

Обновляет или вставляет (upsert) одну запись в базу данных в одном SQL-заявлении INSERT. Она не создаёт модели, а также не вызывает обратные вызовы или валидации Active Record. Однако передаваемые значения проходят типизацию и сериализацию Active Record.

См. ActiveRecord::Persistence#upsert_all для документации.

upsert_all(attributes, returning: nil, unique_by: nil) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 242
def upsert_all(attributes, returning: nil, unique_by: nil)
  InsertAll.new(self, attributes, on_duplicate: :update, returning: returning, unique_by: unique_by).execute
end

Обновляет или вставляет (upsert) несколько записей в базу данных в одном SQL-заявлении INSERT. Она не создаёт модели, а также не вызывает обратные вызовы или валидации Active Record. Однако передаваемые значения проходят типизацию и сериализацию Active Record.

Параметр attributes представляет собой массив словарей. Каждый словарь определяет атрибуты для одной строки и должен содержать ключи.

Возвращает ActiveRecord::Result с содержимым, основанным на :returning (см. ниже).

Параметры

:returning

(Только PostgreSQL) Массив атрибутов для возврата для всех успешно вставленных записей, по умолчанию - первичный ключ. Передайте returning: %w[ id name ] для id и name или returning: false для исключения подлежащей RETURNING SQL-клаузы.

:unique_by

(Только PostgreSQL и SQLite) По умолчанию строки считаются уникальными по всем уникальным индексам в таблице. Повторяющиеся строки пропускаются.

Для пропуска строк только по одному уникальному индексу, используйте :unique_by.

Рассмотрим модель Book, где дублирование ISBN не имеет смысла, но если какая-либо строка имеет существующий id или не уникальна по другому уникальному индексу, ActiveRecord::RecordNotUnique поднимается.

Уникальные индексы могут быть определены по столбцам или имени:

unique_by: :isbn
unique_by: %i[ author_id name ]
unique_by: :index_books_on_isbn

Поскольку она полагается на информацию об индексе из базы данных, :unique_by рекомендуется использовать в паре с кешем схемы Active Record.

Примеры

# Inserts multiple records, performing an upsert when records have duplicate ISBNs.
# Here "Eloquent Ruby" overwrites "Rework" because its ISBN is duplicate.

Book.upsert_all([
  { title: "Rework", author: "David", isbn: "1" },
  { title: "Eloquent Ruby", author: "Russ", isbn: "1" }
], unique_by: :isbn)

Book.find_by(isbn: "1").title # => "Eloquent Ruby"

© 2004–2019 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API