【问题标题】:Rails caching model variables - how to "force reload"?Rails 缓存模型变量 - 如何“强制重新加载”?
【发布时间】:2013-05-26 17:44:18
【问题描述】:

我在 Rails 中实现了一个堆数据结构,所以我基本上得到了一棵二叉树,其节点具有 idnameparent_id

当我尝试“冒泡”我的一个节点时,我注意到一个非常奇怪的错误。这是怎么回事。

node = Item.find(266)
node.children.size
 => 0

node.swap_up
node.children.size
 => 0

node = Item.find(266)
node.children.size
 => 2

我期望看到的行为是,在我 swap_up node 之后,它应该有 2 个孩子(由于在树中冒出一层)。但不知何故,0 的值“一直存在”,直到我从 ActiveRecord 中“重新获取”节点。

这是我model/item.rb的相关定义

belongs_to :parent, :class_name => 'Item'
has_many :children, :class_name => 'Item', :foreign_key => 'parent_id'

这导致我的堆实现中出现各种疯狂的行为。有什么方法可以确保在调用影响节点的方法时“更新”节点的子节点? (或者更准确地说,这会影响 other 节点的 parent_id 开始指向它?)

你们可能得到的任何帮助都将是无价的。谢谢!

【问题讨论】:

  • 你可以尝试用 lambda 重写作用域:children,以便延迟加载吗?不知道能不能帮到你。。

标签: ruby-on-rails caching activerecord rails-activerecord


【解决方案1】:

这是一个可能有帮助的建议。

这将从 db 中检索项目

node = Item.find(266)
node.children.size
 => 0

这使用缓存项

node.swap_up
node.children.size
 => 0

我相信您可以通过这样做摆脱缓存副本并强制它返回数据库

node.swap_up
node.children(true).size
 # should get => 2

而不必再次查询数据库。

【讨论】:

  • 啊,太棒了!我以前从未使用过重置 ActiveRecord 缓存。一个问题是我将children 方法覆盖为return super.sort_by(blah),这触发了wrong number of arguments (1 for 0) 异常。有没有一种方法可以同时自定义方法 并且 让它接受 (true) 参数?
  • 没问题,很高兴为您提供帮助。我不确定评论中的问题,但如果您发布另一个更详细的问题,我相信您会从其他人那里得到一些建议,我会看看它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多