我怎么知道什么时候在Rails中“刷新”我的模型对象?

以下是我正在进行的集成testing的一部分:

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" 

我花了最后一个小时debugging这:)。 在我的初始版本中,我没有在confirm_email_user_url被访问后重新初始化user ,并且即使用户被激活,状态仍然是inactive

我怎么知道我是否应该“重新加载”(没有更好的名字)我的模型对象? 我应该怎样打电话才能这样做呢?

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

在上面的代码中,“user”对象是由User.first从数据库中获取的数据在内存中创build的。 然后,看起来你的confirm_email_user_url修改了数据库 。 该对象不知道这个,直到你reload它,重新从数据库中获取数据。

我不确定是否有程序化的方法来知道什么时候需要重新加载对象,但作为一名开发人员,您应该了解正在发生的事情并进行适当的处​​理。 在我的大部分经验中(这是有限的),这只是testing期间的一个问题。 在生产中,数据库中的对象在内存中加载时不会被修改。 通常发生的情况是内存中的对象被修改,然后保存到数据库(即user.email = "foo@bar.com"接着是user.save )。 我想如果你有一个高活动的应用程序,很多用户可能会在短时间内修改某些东西,那么你应该小心一点。

顺便说一句。 当你在模型本身上做类似于Report.count事情时,这并不是真正的工作。 经过无数次重置列信息或获取第一个/最后一个logging的实例并重新加载它,唯一帮助我重新连接数据库之间的数据如下所示:

 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 +版本。