У меня есть эта модель задачи:
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. Таким образом, после уничтожения остается только корень.
Однако этот тест теперь не проходит после того, как я добавил обратный вызов before_save к Задаче. Это код, который я добавил в задачу:
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
. Я думаю, что self.children
в handled_parent_id_change
является виновником, потому что, когда я закомментирую блок self.children.each do |sub_task|
, тест снова проходит.
Есть идеи?