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 endend
测试成功:当我销毁d1时,它会破坏d1的所有后代.因此,在破坏之后只剩下根.
但是,在我向Task添加了before_save回调之后,此测试现在失败了.这是我添加到Task的代码:
before_save :update_descendants_if_necessarydef update_descendants_if_necessary handle_parent_ID_change if self.parent_ID_changed? return trueenddef handle_parent_ID_change self.children.each do |sub_task| #the code within the loop is deliberately commented out endend
当我添加此代码时,assert_equal 1,Task.count失败,使用Task.count == 4.我认为在managed_parent_ID_change下的self.children是罪魁祸首,因为当我注释掉self.children.each do | sub_task |时.阻止,测试再次通过.
有任何想法吗?
解决方法 我发现了这个BUG.这条线d1 = create_task(:parent_ID => @root.ID,:sort_order => 2)
创建d1.这会调用before_save回调,而后者又调用self.children.正如猎户座所指出的,这会缓解d1的孩子们.
但是,此时,d1还没有任何孩子.所以d1的孩子们的空白是空的.
因此,当我试图摧毁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不会破坏模型的子项全部内容,希望文章能够帮你解决ruby-on-rails – acts_as_tree不会破坏模型的子项所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)