Act_as_tree does not destroy model children

I have this task model:

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

And I have this test

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

The test is successful: when I destroy d1, it destroys all descendants of d1. Thus, after destruction, only the root remains.

However, this test now fails after I added the before_save callback to the Task. This is the code I added to the 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

When I added this code assert_equal 1, Task.countfails, Task.count == 4. I think that self.childrenunder handled_parent_id_changeis the culprit, because when I comment on a block self.children.each do |sub_task|, the test passes again.

Any ideas?

+5
source share
2 answers

I found a mistake. Line

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)), .

+4

children - has_many

, .children ( ). .

, "" , , , Task.count, d1.children.count.

? SQL, . mysql, ,

+1

All Articles