Ruby on rails 作为树不会破坏模型';孩子们

Ruby on rails 作为树不会破坏模型';孩子们,ruby-on-rails,ruby,acts-as-tree,Ruby On Rails,Ruby,Acts As Tree,我有这个任务模型: class Task < ActiveRecord::Base acts_as_tree :order => 'sort_order' end 添加此代码时,assert_equal 1,Task.count失败,其中Task.count==4。我认为solve\u parent\u id\u change下的self.children是罪魁祸首,因为当我注释掉self.children.each do | sub_task块时,测试再次通过 有什么想法吗?

我有这个任务模型:

class Task < ActiveRecord::Base
  acts_as_tree :order => 'sort_order'
end
添加此代码时,
assert_equal 1,Task.count
失败,其中
Task.count==4
。我认为
solve\u parent\u id\u change
下的
self.children
是罪魁祸首,因为当我注释掉
self.children.each do | sub_task
块时,测试再次通过

有什么想法吗?

孩子们

这意味着,当您调用
.children
时,它将从数据库中加载它们(如果尚未存在)。然后它将缓存它们

我想说的是,您的第二个“测试”实际上将查看缓存的值,而不是真实的数据库,但这不应该发生,因为您只是使用
Task.count
而不是
d1.children.count
。人力资源管理


你看过日志了吗?它们将向您显示正在执行的SQL。您可能会在那里看到一个mysql错误,它将告诉您发生了什么事

我发现了错误。线路

d1 = create_task(:parent_id => @root.id, :sort_order => 2)
创建d1。这将调用
before\u save
回调,该回调反过来调用
self.children
。正如猎户座所指出的,d1的孩子就藏在这里

然而,在这一点上,d1还没有任何孩子。所以d1的子缓存是空的

因此,当我试图摧毁d1时,程序试图摧毁d1的孩子。它遇到缓存,发现它是空的,结果不会破坏d2、d3和d4

我通过如下更改任务创建来解决此问题:

@root.children << (d1 = new_task(:sort_order => 2))
@root.save!
@root.children(2))
@root.save!
我想也可以通过重新加载d1(
d1.reload
)或self.children(
self.children(true)
)来解决这个问题,尽管我没有尝试这些解决方案

d1 = create_task(:parent_id => @root.id, :sort_order => 2)
@root.children << (d1 = new_task(:sort_order => 2))
@root.save!