加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – acts_as_tree不会破坏模型的子项

发布时间:2020-12-17 03:11:02 所属栏目:百科 来源:网络整理
导读:我有这个任务模型: 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 =
我有这个任务模型:

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的所有后代.因此,在破坏之后只剩下根.

但是,在我向Task添加了before_save回调之后,此测试现在失败了.这是我添加到Task的代码:

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.我认为在managed_pa??rent_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))来解决这个问题,虽然我没有尝试任何这些解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读