Spec-Zone.ru › Ruby on Rails 5.2

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

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

create(attributes = nil, &block) Показать исходный код
# 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
create!(attributes = nil, &block) Показать исходный код
# 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 может быть либо словарём, либо массивом словарей. Эти словари описывают атрибуты для создания объекта или нескольких объектов, когда передан массив словарей.

delete(id_or_array) Показать исходный код
# 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])
destroy(id) Показать исходный код
# 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)
instantiate(attributes, column_types = {}, &block) Показать исходный код
# 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 чтобы увидеть, как реализуется эта система наследования «в одной таблице».

update(id, attributes) Показать исходный код
# 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.

Spec-Zone.ru

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