Подтвердить что ты не робот

Обновление временных меток с помощью #update_all

Когда у меня есть список идентификаторов, которые я хочу обновить их свойство, поле updated_at в базе данных, похоже, не меняется, вот что я имею в виду:

ids = [2,4,51,124,33]
MyObj.where(:id => ids).update_all(:closed => true)

После выполнения этого обновления updated_at поле не изменяется. Однако, когда я вхожу в консоль рельсов с помощью rails c и делаю это:

obj = MyObj.find(2)
obj.closed = false;
obj.save!

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

Edit

Я только что узнал из dax ответ, что:

Timestamps

Note that ActiveRecord will not update the timestamp fields (updated_at/updated_on) when using update_all().

Я не хочу обновлять одну запись за раз, есть ли способ обойти это? не прибегая к уровню sql?

4b9b3361

Ответ 1

#update_all не создает экземпляры моделей.

Таким образом, он не вызывает обратные вызовы и валидации - и обновление временной отметки выполняется в обратном вызове.

Изменить об изменении:

Если вы хотите сохранить "один запрос для их правильного управления", вы можете обновить update_at, а также :closed:

MyObj.where(:id => ids).update_all(closed: true, updated_at: DateTime.now)

Но не забывайте, что проверки еще не выполняются.

Ответ 2

Обновляет все. Этот метод создает один оператор SQL UPDATE и отправляет его прямо в базу данных. Он не создает экземпляры задействованных моделей и не активирует обратные вызовы Active Response или проверки. Значения, переданные в update_all, не будут проходить через поведение приведения типа ActiveRecord. Он должен получать только значения, которые могут быть переданы как есть в базу данных SQL.

Таким образом, он не вызывает обратные вызовы или проверки - и обновление временной отметки выполняется в callback.update_at - это обратный вызов для ссылки http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-update_all