3

我在 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_upnode它应该有 2 个孩子(由于在树中冒出一层)。但不知何故,0 的值“持续存在”,直到我从 ActiveRecord“重新获取”节点。

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

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

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

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

4

1 回答 1

4

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

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

而不必再次查询数据库。

于 2013-05-31T04:58:04.223 回答