Обновление временных меток с помощью #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?
Ответы
Ответ 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
Ответ 3
Timestamps
Обратите внимание, что ActiveRecord не обновляет поля timestamp (updated_at/updated_on) при использовании update_all().
источник: http://apidock.com/rails/ActiveRecord/Relation/update_all