Spec-Zone.ru › Ruby on Rails 7.2

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

Общедоступные методы экземпляров

build(attributes = nil, &block) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 82
def build(attributes = nil, &block)
  if attributes.is_a?(Array)
    attributes.collect { |attr| build(attr, &block) }
  else
    new(attributes, &block)
  end
end

Создаёт объект (или несколько объектов) и возвращает либо созданный объект, либо список созданных объектов.

Параметр attributes может быть либо Hash, либо Array массивом хешей. Эти хеши описывают атрибуты объектов, которые необходимо создать.

Примеры

# Build a single new object
User.build(first_name: 'Jamie')

# Build an Array of new objects
User.build([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }])

# Build a single object and pass it into a block to set other attributes.
User.build(first_name: 'Jamie') do |u|
  u.is_admin = false
end

# Building an Array of new objects using a block, where the block is executed for each object:
User.build([{ 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 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 может быть либо Hash, либо Array массивом хешей. Эти хеши описывают атрибуты объектов, которые необходимо создать.

Примеры

# 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 может быть либо Hash, либо Array массивом хешей. Эти хеши описывают атрибуты объекта (или нескольких объектов, если передан массив хешей).

instantiate(attributes, column_types = {}, &block) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 100
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 для того, как реализовано это отображение наследования "single-table".

query_constraints(*columns_list) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 212
def query_constraints(*columns_list)
  raise ArgumentError, "You must specify at least one column to be used in querying" if columns_list.empty?

  @query_constraints_list = columns_list.map(&:to_s)
  @has_query_constraints = @query_constraints_list
end

Принимает список имён атрибутов, которые будут использоваться в условии WHERE запросов SELECT/UPDATE/DELETE и в условии ORDER BY для методов поиска #first и #last.

class Developer < ActiveRecord::Base
  query_constraints :company_id, :id
end

developer = Developer.first
# SELECT "developers".* FROM "developers" ORDER BY "developers"."company_id" ASC, "developers"."id" ASC LIMIT 1
developer.inspect # => #<Developer id: 1, company_id: 1, ...>

developer.update!(name: "Nikita")
# UPDATE "developers" SET "name" = 'Nikita' WHERE "developers"."company_id" = 1 AND "developers"."id" = 1

# It is possible to update an attribute used in the query_constraints clause:
developer.update!(company_id: 2)
# UPDATE "developers" SET "company_id" = 2 WHERE "developers"."company_id" = 1 AND "developers"."id" = 1

developer.name = "Bob"
developer.save!
# UPDATE "developers" SET "name" = 'Bob' WHERE "developers"."company_id" = 1 AND "developers"."id" = 1

developer.destroy!
# DELETE FROM "developers" WHERE "developers"."company_id" = 1 AND "developers"."id" = 1

developer.delete
# DELETE FROM "developers" WHERE "developers"."company_id" = 1 AND "developers"."id" = 1

developer.reload
# SELECT "developers".* FROM "developers" WHERE "developers"."company_id" = 1 AND "developers"."id" = 1 LIMIT 1
update(id = :all, attributes) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 132
def update(id = :all, attributes)
  if id.is_a?(Array)
    if id.any?(ActiveRecord::Base)
      raise ArgumentError,
        "You are passing an array of ActiveRecord::Base instances to `update`. " \
        "Please pass the ids of the objects by calling `pluck(:id)` or `map(&:id)`."
    end
    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 - Это должен быть идентификатор или массив идентификаторов для обновления. Необязательный аргумент, по умолчанию все записи в соотношении.

  • 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 для обновления всех записей в одном запросе.

update!(id = :all, attributes) Показать исходный код
# File activerecord/lib/active_record/persistence.rb, line 158
def update!(id = :all, attributes)
  if id.is_a?(Array)
    if id.any?(ActiveRecord::Base)
      raise ArgumentError,
        "You are passing an array of ActiveRecord::Base instances to `update!`. " \
        "Please pass the ids of the objects by calling `pluck(:id)` or `map(&:id)`."
    end
    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

Обновляет объект (или несколько объектов) так же, как и update, но вызывает update! вместо update, поэтому исключение генерируется, если запись некорректна и сохранение не удастся.

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

Spec-Zone.ru

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