J'ai un modèle appelé dossier qui agit comme un arbre. Dans le modèle, j'ai une copie de méthode d'instance qui copie les dossiers d'un endroit à l'autre. Lors de la copie d'un dossier, ses sous-dossiers doivent également être copiés.Ma fonction récursive ne se termine pas. Qu'est-ce que je fais mal?
Ceci est mon code:
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
Considérons maintenant la situation suivante:
Root folder-+
|
Folder 1-+
|
Folder 2-+
|
Folder 3
Lorsque je copie le dossier 1 dans le dossier racine il fonctionne très bien. Cela fonctionne également quand je copie le dossier 1 dans le dossier 2, mais quand je copie le dossier 1 dans le dossier 3 je finis avec la récursivité sans fin. Dans le code:
f1 = Folder.find_by_name('Folder 1')
f3 = Folder.find_by_name('Folder 3')
f1.copy(f3) # Never stops
Ce code conduit à:
Root folder-+
|
Folder 1-+
|
Folder 2-+
|
Folder 3-+
|
Folder 1-+
|
Folder 2-+
|
Folder 3-+
|
Folder 1-+
|
Folder 2-+
|
Folder 3-+
|
Folder 1-+
|
Etc.
je donne sur quelque chose de trivial, mais je ne peux pas le comprendre. Qu'est-ce que je fais mal??
Que voulez-vous dire exactement? Il semble que je fais déjà la copie du dossier en cours avant la boucle. (Dans les trois premières lignes de la méthode) Pourriez-vous me montrer du code? Je vous remercie! – Mischa
Désolé, je voulais dire "après". – Marcin