我怎么知道什么时候在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 +版本。