2013-09-18 2 views
13

изменить, вот что я имею в виду:Обновление метки времени с #update_all

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 в моем приложении, поскольку я слушаю обновления и делаю весь поток приложений, когда это происходит?

Редактировать

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

Timestamps 

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

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

ответ

28

#update_alldoes not instantiate models.

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

Редактировать о редактировании:

Если вы хотите сохранить «один запрос, чтобы управлять ими всеми», вы можете обновить updated_at, а также :closed:

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

Но знайте, валидация все еще не запустить.

+1

+1 для «одного запроса, чтобы управлять всем» - и это лучший ответ :) – dax

+0

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

+0

Я думаю, что 'Time.now' в этом случае более присвоен – coorasse

0

Timestamps

Обратите внимание, что ActiveRecord не обновит временные метки поля (updated_at/updated_on) при использовании update_all().

Источник: http://apidock.com/rails/ActiveRecord/Relation/update_all

+0

есть способ обойти это? –

+0

вы могли бы попробовать что-то вроде этого: http://stackoverflow.com/a/10039194/2128691 – dax

+0

в основном просто создайте свой собственный столбец «update» и обновите его вместе с тем, что вы обновляете. – dax

1

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

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

Смежные вопросы