我正在Rails中实现堆数据结构,所以基本上我有一个二叉树,其节点有id
,name
和parent_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开始指向它吗?)
你们可能拥有的任何帮助都是非常宝贵的。谢谢!
答案 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
而不必再次查询数据库。