Как я могу узнать, когда "обновить" мой объект модели в Rails? - PullRequest
59 голосов
/ 02 апреля 2011

Вот часть моего интеграционного теста:

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 после того, как было подтверждено значение valid_email_user_url, и состояние всегда было inactive, хотя пользователь был активирован.

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

Ответы [ 2 ]

126 голосов
/ 17 сентября 2011

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

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

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

6 голосов
/ 19 сентября 2012

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+ версиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...