Rails缓存模型变量 - 如何“强制重新加载”?

时间:2013-05-31 00:54:50

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

我正在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'

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

你们可能拥有的任何帮助都是非常宝贵的。谢谢!

1 个答案:

答案 0 :(得分:3)

这是一个可能有用的建议。

这将从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

而不必再次查询数据库。