Разница между update и update_attributes - PullRequest
0 голосов
/ 18 декабря 2018

В Rails 5, в чем разница между методами update и update_attributes.Я вижу следующие результаты для обоих методов

  1. Возвращает true / false
  2. Проверка на активную проверку записи
  3. Вызваны обратные вызовы

, а также в отношении метода обновления была введена новая вещь в отношении активной записи.Я не могу этого понять.В чем разница?

Более того, мы используем update_attributes в Rails 5. Его нет в документации по активной записи.

Я запутался со всеми методами обновления.Мне нужна ясность

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Когда мы работаем с update_column, обновление времени выполняется на уровне базы данных, никакой связи с рельсами ORM не происходит, поэтому любая логика, реализованная нами, например, обратные вызовы и проверки, будет бесполезной и бесполезной, поскольку это будетбыть обойденным.

0 голосов
/ 30 мая 2019

Начиная с Rails 4.0.2, #update возвращает false, если обновление не удалось.До Rails 4.0.2 #update возвращал обновленный объект.Таким образом, основным отличием было возвращаемое значение.После этого изменения #update_attributes это просто псевдоним #update.Кажется, есть разговоры об устаревании #update_attributes в Rails 6, который еще не выпущен.

0 голосов
/ 18 декабря 2018

Из файлов rails 5, как мне кажется, update можно использовать для обновления нескольких объектов (массив записей), но атрибуты update_attributes работают только с отдельными записями, в противном случае оба они одинаковы

Из основных файлов rails для update_attributes:

Обновляет отдельный атрибут и сохраняет запись.Это особенно полезно для логических флагов на существующих записях.Также обратите внимание, что

  • Проверка пропущена.
  • \ Обратные вызовы вызываются.
  • updated_at / updated_on столбец обновляется, если этот столбец доступен.
  • Обновляет все атрибуты, которые являются грязными в этом объекте.

Этот метод вызывает ActiveRecord :: ActiveRecordError, если атрибут помечен как только для чтения.

def update_attribute(name, value)
  name = name.to_s
  verify_readonly_attribute(name)
  public_send("#{name}=", value)

  save(validate: false)
end

Для обновления

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

==== Параметры

  • + id + - Это должен быть идентификатор или массив идентификаторов.подлежит обновлению.
  • + attribute + - Это должен быть хеш атрибутов или массив хешей.

==== Примеры

# Обновляет одну записьPerson.update (15, user_name: "Samuel", группа: "expert")

# Обновляет несколько записей people = {1 => {"first_name" => "David"}, 2 => {"first_name "=>" Jeremy "}} Person.update (people.keys, people.values)

# Обновляет несколько записей из результата отношения people = Person.where (group:" expert ") people.update (group: "master")

Примечание. При обновлении большого количества записей для каждой записи будет выполняться запрос UPDATE, что может привести к снижению производительности.Когда запуск обратных вызовов не требуется для каждого обновления записи, предпочтительно использовать {update_all} [rdoc-ref: Relation # update_all] для обновления всех записей в одном запросе.

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
...