私はツリーとして機能するfolderというモデルを持っています。モデルの中には、ある場所から別の場所にフォルダをコピーするインスタンスメソッドのコピーがあります。フォルダをコピーするときには、そのサブフォルダもコピーする必要があります。私の再帰関数は終了しません。私は間違って何をしていますか?
これは私のコードです:私は、ルートフォルダにフォルダ1をコピーすると、それが正常に動作します
Root folder-+
|
Folder 1-+
|
Folder 2-+
|
Folder 3
:
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
は今、次のような状況を考慮してください。また、フォルダ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.
私は些細な何かを見下ろすのですが、私はちょうどそれを把握することはできません。私は何を間違えているのですか?
正確にはどういう意味ですか?私はすでにループの前に現在のフォルダのコピーをやっているようです。 (メソッドの最初の3行で)コードを表示できますか?ありがとうございました! – Mischa
申し訳ありませんが、私は "後"を意味しました。 – Marcin