Sort-оф.
Model.update_all
выдает запрос на обновление непосредственно к базовой базе данных; он не обновляет экземпляры, которые у вас уже есть в памяти. Аналогично, instance.update_attributes
только обновляет - он не извлекает данные из базы данных, поскольку предполагает, что экземпляр уже имеет самые последние значения атрибутов.
Этот обычно работает в Rails, экземпляры, как правило, недолговечны: они существуют только в рамках запроса, и в большинстве случаев с ними работают напрямую.
В описанной выше ситуации вам потребуется дополнительный шаг - Model#reload
сделает то, что вы хотите:
# create our instance
@butterfly = Butterfly.create(color: 'blue') # => #<Butterfly id: 100, color: 'blue'>
Butterfly.update_all(color: 'red')
# We now have a mis-match between our instance and our database. Our instance
# is still blue, but the database says it should be red. Reloading it...
@butterfly.reload # => #<Butterfly id: 100, color: 'red'>
# And we can now re-update our butterfly
@butterfly.update_attributes(size: 'big') # => #<Butterfly id: 100, color: 'red', size: 'big'>
Если вы используете update_all
, неплохо бы посмотреть, возможно ли структурировать ваш код так, чтобы он происходил за до того, как вы загрузите экземпляры.