【问题标题】:How can I know when to "refresh" my model object in Rails?我如何知道何时在 Rails 中“刷新”我的模型对象?
【发布时间】:2011-07-28 01:04:47
【问题描述】:

这是我正在进行的集成测试的一部分:

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"

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

我如何知道我是否应该“重新加载”(没有更好的名称)我的模型对象?我应该怎么调用才能这样做?

【问题讨论】:

标签: ruby-on-rails ruby testing activerecord


【解决方案1】:

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

在上面的代码中,“用户”对象是根据User.first 从数据库中获取的数据在内存中创建的。然后,看起来您的confirm_email_user_url 修改了数据库。该对象直到您reload 它才知道这一点,它会从数据库中重新获取数据。

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

【讨论】:

  • 我不明白,user = User.firstUser.first 不会再次触发查询吗?它应该自动重新加载?没有?
  • User.first 将再次查询数据库。您可以通过在一个窗口中打开rails c 和在另一个窗口中打开tail -f log/development.rb 来检查它。然后在控制台输入user = User.first 两次。您将在第二个窗口中看到两个带有日志的查询
【解决方案2】:

顺便说一句。当您在模型本身上执行诸如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+ 版本。

【讨论】:

  • 对于我的特定用例(多个请求访问相同的数据,然后一个请求更新数据,第二个请求尝试获取更新),相当于 user.reload 不起作用,但是报告.连接.重新连接!工作。
猜你喜欢
  • 1970-01-01
  • 2011-01-12
  • 2017-03-05
  • 2010-12-14
  • 2021-05-19
  • 1970-01-01
  • 2021-01-04
  • 2014-02-07
  • 1970-01-01
相关资源
最近更新 更多