Что возвращает update_attribute в случае сбоя?
У меня есть следующий кусок кода
@user = User.find(params[:id])
if (@user.activation_status == "active")
#some code here
@user.update_attribute('activation_status' ,'inactive') # Line 44
#send mail to user that his account is Acivated
else
end
Есть ли шанс, что Line 44
может потерпеть неудачу? Поскольку память базы данных переполнена или произошел сбой сети. Что будет в этом случае? Если это создает проблему, как лучше ее избежать? Что значит update_attribute
вернуть, если это не удалось?
2 ответа
Вот источник для update_attribute
:
def update_attribute(name, value)
send(name.to_s + '=', value)
save(false)
end
Вы можете видеть, что он обновляет запрошенный атрибут, а затем вызывает save с perform_validations
установлен в false
, Следовательно update_attribute
вернется false
если какой-либо из обратных вызовов сохранения (например, before_save
) предотвратил сохранение записи путем возврата false
,
Если произошла ошибка нижнего уровня, например, нехватка памяти в базе данных, то я ожидаю, что драйвер базы данных вызовет это как исключение, которое будет передано в ваш код.
Если update_attributes не удается, он вернет false. если вы проигнорируете возвращаемое значение, вы даже не поймете, что это произошло. Вы можете использовать update_attributes!, который в свою очередь вызывает save!, что, в свою очередь, вызывает исключение, если что-то идет не так. Хотя это то, что вы не можете пропустить (если вы не напишете всеохватывающие операторы спасения), но если вы не поймаете это, оно попадет в Rails и прервет запрос.
Обычно хорошей идеей является проверка возвращаемого значения.