我怎么知道何时在Rails中"刷新"我的模型对象?

Geo*_*Geo 61 ruby testing activerecord ruby-on-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"
Run Code Online (Sandbox Code Playgroud)

我花了最后一小时调试这个:).在我的初始版本中,我在user访问confirm_email_user_url后没有重新初始化,并且inactive即使用户被激活,状态也始终如此.

我怎么知道我是否应该"重新加载"(缺少一个更好的名字)我的模型对象?我应该怎么做才能这样做?

dan*_*ain 129

user.reload每当数据库中的数据发生变化时,您都需要进行调用.

在上面的代码中,"user"对象是从数据库中提取的数据在内存中创建的User.first.然后,看起来您confirm_email_user_url修改了数据库.在您reload重新获取数据库中的数据之前,该对象不知道这一点.

我不确定是否有一种编程方式可以知道何时需要重新加载对象,但作为开发人员,您应该了解正在发生的事情并进行适当处理.在我的大多数经验中(有些限制),这只是测试期间的一个问题.在生产中,当数据库加载到内存中时,对象在数据库中进行修改并不典型.通常发生的是内存中的对象被修改然后保存到数据库(即,user.email = "foo@bar.com"后跟user.save).我想如果你有一个高活动的应用程序,许多用户可能会在短时间内修改某些东西,你会想要小心它.


Tho*_*ser 6

顺便说一句.当你在模型本身上做的事情时,这并没有真正起作用Report.count.在无休止地尝试重置列信息或获取第一个/最后一个记录的实例并重新加载它之后,唯一有帮助的是在数据之间重新连接数据库,如下所示:

initial_count = Report.count

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

Report.connection.reconnect!
final_count = Report.count
Run Code Online (Sandbox Code Playgroud)

这适用于Rails 2.3.8+,我不知道3+版本.