我有一个称为文件夹的模型,充当一棵树。在模型中,我有一个实例方法副本,可以将文件夹从一个地方复制到另一个地方。复制文件夹时,其子文件夹也必须复制。我的递归函数没有结束。我究竟做错了什么?
这是我的代码:
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.
我忽视的东西微不足道,但我无法弄清楚。我究竟做错了什么??
你是什么意思?看来我已经在循环之前复制了当前文件夹。 (在方法的前三行)你能给我看一些代码吗?谢谢! – Mischa 2011-04-17 23:43:07
对不起,我的意思是“之后”。 – Marcin 2011-04-17 23:58:24