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

Как узнать, когда "обновить" мой объект модели в Rails?

Здесь часть теста интеграции, который у меня есть:

user = User.first
assert !user.is_active?

get confirm_email_user_url(user),:confirmId => user.mail_confirmation_hash

assert_equal response.status,200
# because confirm_email_user_url modifies the activation state of the object
user = User.first
assert_equal user.state,"activated"

Я провел последний час, отлаживая это:). В моей первоначальной версии я не был повторно инициализирован user после того, как был достигнут файл confirm_email_user_url, и состояние всегда inactive, даже если пользователь был активирован.

Как узнать, должен ли я "перезагрузить" (не имея лучшего имени) мой объект модели? Что я должен назвать, чтобы сделать это?

4b9b3361

Ответ 1

Вам нужно будет вызвать user.reload всякий раз, когда данные были изменены в базе данных.

В приведенном выше коде пользовательский объект создается в памяти из данных, полученных из базы данных с помощью User.first. Затем, похоже, ваш confirm_email_user_url изменяет базу данных. Объект не знает об этом до тех пор, пока вы не reload его, который повторно приобретает данные из базы данных.

Я не уверен, есть ли программный способ узнать, когда вам нужно будет перезагрузить объект, но как разработчик вы должны знать, что происходит и обрабатывать соответствующим образом. В большинстве моих опытов (которые несколько ограничены) это только проблема во время тестирования. В производстве это не типично для объекта, который должен быть изменен в базе данных, пока он загружен в память. Обычно случается, что объект в памяти модифицируется, а затем сохраняется в базе данных (т.е. user.email = "[email protected]", а затем user.save). Я полагаю, если бы у вас было приложение с высокой активностью, в котором многие пользователи могли бы что-то менять в короткие сроки, вы бы хотели быть осторожны.

Ответ 2

Btw. это действительно не работает, когда вы делаете что-то на самой модели, например Report.count. После бесконечных попыток сбросить информацию о столбцах или получить экземпляр первой/последней записи и перезагрузить ее, единственное, что помогло мне, - это переподключение базы данных между такими значениями:

initial_count = Report.count

# do something, like invoking a rake task that imports the reports, ..

Report.connection.reconnect!
final_count = Report.count

Это работало для Rails 2.3.8+, я не знаю о 3+ версиях.