У меня есть модель под названием папка, которая действует как дерево.Внутри модели у меня есть экземпляр метода экземпляра, который копирует папки из одного места в другое.При копировании папки также необходимо скопировать ее подпапки.
Это мой код:
class Folder < ActiveRecord::Base
acts_as_tree :order => 'name'
before_save :check_for_parent
def copy(target_folder)
new_folder = self.clone
new_folder.parent = target_folder
new_folder.save!
# Copy sub-folders recursively
self.children.each do |folder|
folder.copy(new_folder) unless folder == new_folder
end
end
def check_for_parent
raise 'Folders must have a parent.' if parent.nil? && name != 'Root folder'
end
end
Теперь рассмотрим следующую ситуацию:
Root folder-+
|
Folder 1-+
|
Folder 2-+
|
Folder 3
Когда я копирую папку 1 в корневую папку, она работает нормально.Это также работает, когда я копирую папку 1 в папку 2, но когда я копирую папку 1 в папку 3, я получаю бесконечную рекурсию.В коде:
f1 = Folder.find_by_name('Folder 1')
f3 = Folder.find_by_name('Folder 3')
f1.copy(f3) # Never stops
Этот код приводит к:
Root folder-+
|
Folder 1-+
|
Folder 2-+
|
Folder 3-+
|
Folder 1-+
|
Folder 2-+
|
Folder 3-+
|
Folder 1-+
|
Folder 2-+
|
Folder 3-+
|
Folder 1-+
|
Etc.
Я пропускаю что-то тривиальное, но я просто не могу понять это.Что я делаю не так ??