【问题标题】:ruby on rails 3 reload using cached dataruby on rails 3 使用缓存数据重新加载
【发布时间】:2011-03-29 04:48:12
【问题描述】:

在我的应用中使用 activerecord reload 命令似乎在调用时使用了缓存数据。

我可以通过执行以下操作在调试器中进行复制。

u = User.find(1)
u.first_name
#outputs bob

# manually change first_name for record 1 to jim with PGadmin or with rails console

u.reload
u.valid?
#outputs true
u.first_name
#outputs bob

#if i do this again
u = User.find(1)
#old data again
u.first_name
#outputs bob

#if i load data this way
u = User.where('id = 1').first
#new data
u.first_name 
#outputs jim

在运行 reload 后查看我的日志文件时,它会打印出来

[1m[35mCACHE (0.0ms)[0m SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1

看来是在使用缓存

我的环境:Rails 3.0.3、Ruby 1.8.7、Ubuntu 10.04、PostgreSQL 8.4

【问题讨论】:

  • 请提供更详细的示例,说明如何手动更改数据库行,并提供 w.valid? 的输出。
  • 改名后记得保存记录吗?
  • 是的,记录已保存。如果我重新加载页面,它会获取更改。

标签: ruby-on-rails activerecord


【解决方案1】:

您需要进行写入(例如,通过在某些模型上调用 save),以便查询缓存被炸毁。

如果您在执行reload 时查看您的 development.log,ActiveRecord 会发出 SELECT 查询。但是,它不会炸毁查询缓存,而是用来回答User.find(1) 查询。

我认为重新加载适用于从应用程序的其他部分更新数据库时。我也认为你可以像这样包装你的 find 以避免缓存:

ActiveRecord::Base.uncached do
  User.find(1)
end

【讨论】:

  • 我不得不同时使用未缓存和重新加载
【解决方案2】:

确保您的管理工具确实更改了 DB 中的数据。例如用一个工具写入数据,用另一个工具读取数据。

【讨论】:

  • 添加了附加信息以显示不同的查询返回表明数据已保存的新数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2013-04-15
  • 2011-03-17
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
相关资源
最近更新 更多