que tengo este modelo de tareas:acts_as_tree no destruir a los niños del modelo
class Task < ActiveRecord::Base
acts_as_tree :order => 'sort_order'
end
Y puedo tener este examen
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
La prueba es satisfactoria: cuando destruyo d1, destruye todos los descendientes de d1. Por lo tanto, después de la destrucción solo queda la raíz.
Sin embargo, esta prueba ahora está fallando después de haber agregado una devolución de llamada before_save a la tarea. Este es el código añadí a la Tarea:
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
Cuando añadí este código, assert_equal 1, Task.count
falla, con Task.count == 4
. Creo que self.children
bajo handled_parent_id_change
es el culpable, porque cuando comento el bloque self.children.each do |sub_task|
, la prueba pasa nuevamente.
¿Alguna idea?