gpt4 book ai didi

ruby-on-rails - acts_as_tree 不会破坏模型的 child

转载 作者:数据小太阳 更新时间:2023-10-29 07:16:37 26 4
gpt4 key购买 nike

我有这个任务模型:

class Task < ActiveRecord::Base
acts_as_tree :order => 'sort_order'
end

我有这个测试

class TaskTest < Test::Unit::TestCase
def setup
@root = create_root
end

def test_destroying_a_task_should_destroy_all_of_its_descendants
d1 = create_task(:parent_id => @root.id, :sort_order => 2)
d2 = create_task(:parent_id => d1.id, :sort_order => 3)
d3 = create_task(:parent_id => d2.id, :sort_order => 4)
d4 = create_task(:parent_id => d1.id, :sort_order => 5)
assert_equal 5, Task.count

d1.destroy

assert_equal @root, Task.find(:first)
assert_equal 1, Task.count
end
end

测试成功:当我销毁d1时,它销毁了d1的所有后代。因此,销毁后只剩下根。

但是,在我向任务添加 before_save 回调后,此测试现在失败了。这是我添加到任务中的代码:

before_save :update_descendants_if_necessary

def update_descendants_if_necessary
handle_parent_id_change if self.parent_id_changed?
return true
end

def handle_parent_id_change
self.children.each do |sub_task|
#the code within the loop is deliberately commented out
end
end

当我添加此代码时,assert_equal 1, Task.count 失败,Task.count == 4。我认为 handled_pa​​rent_id_change 下的 self.children 是罪魁祸首,因为当我注释掉 self.children.each do |sub_task| block 时,测试再次通过。

有什么想法吗?

最佳答案

我发现了错误。线路

d1 = create_task(:parent_id => @root.id, :sort_order => 2)

创建 d1。这会调用 before_save 回调,后者又会调用 self.children。正如 Orion 所指出的,这会缓存 d1 的子项。

但是,此时 d1 还没有任何 child 。所以 d1 的 child 缓存是空的。

因此,当我尝试销毁 d1 时,程序会尝试销毁 d1 的子级。遇到缓存,发现是空的,结果没有销毁d2、d3、d4。

我通过像这样更改任务创建来解决这个问题:

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

这行得通,所以我同意 :) 我认为也可以通过重新加载 d1 (d1.reload) 或 self.children (self.children (true)) 虽然我没有尝试任何这些解决方案。

关于ruby-on-rails - acts_as_tree 不会破坏模型的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/171529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com