ツリーとして機能するfolderというモデルがあります。モデル内には、フォルダーをある場所から別の場所にコピーするインスタンスメソッドのコピーがあります。フォルダをコピーするときは、そのサブフォルダもコピーする必要があります。
これは私のコードです:
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.
些細なことを見落としていますが、理解できません。私は何が間違っているのですか?