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