我有一個稱爲文件夾的模型,充當一棵樹。在模型中,我有一個實例方法副本,可以將文件夾從一個地方複製到另一個地方。複製文件夾時,其子文件夾也必須複製。我的遞歸函數沒有結束。我究竟做錯了什麼?
這是我的代碼:
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