du modèle que j'ai ce modèle de tâche:acts_as_tree ne pas détruire les enfants
class Task < ActiveRecord::Base
acts_as_tree :order => 'sort_order'
end
Et je ce 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
Le test est réussi: quand je détruirai d1, il détruit tous les descendants de d1. Ainsi, après la destruction, seule la racine est laissée.
Toutefois, ce test échoue maintenant après avoir ajouté un rappel before_save à la tâche. Voici le code que j'ajouté à la tâche:
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
Quand j'ai ajouté ce code, assert_equal 1, Task.count
échoue, avec Task.count == 4
. Je pense que self.children
sous handled_parent_id_change
est le coupable, parce que quand je commente le bloc self.children.each do |sub_task|
, le test passe à nouveau.
Des idées?