Как я могу знать, когда "обновить" мой объект модели в 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 даже если пользователь был активирован.

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

2 56

2 ответа:

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

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

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

кстати. это действительно не работает, когда вы делаете вещи на самой модели, как 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+.