2011-04-17 55 views
-1

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

這是我的代碼:

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. 

我忽視的東西微不足道,但我無法弄清楚。我究竟做錯了什麼??

回答

0

我不得不跟蹤我最初複製的文件夾。下面的代碼工作。當然,如果有人看到有改進的餘地,請告訴我。

def copy(target_folder, originally_copied_folder = nil) 
    new_folder = self.clone 
    new_folder.parent = target_folder 
    new_folder.save! 

    originally_copied_folder = new_folder if originally_copied_folder.nil? 

    # Copy sub-folders recursively 
    self.children.each do |folder| 
     folder.copy(new_folder, originally_copied_folder) unless folder == originally_copied_folder 
    end 
    end 
0

嘗試在循環實現遞歸(即預序遞歸)之前複製當前文件夾。

+0

你是什麼意思?看來我已經在循環之前複製了當前文件夾。 (在方法的前三行)你能給我看一些代碼嗎?謝謝! – Mischa 2011-04-17 23:43:07

+0

對不起,我的意思是「之後」。 – Marcin 2011-04-17 23:58:24

1

試着改變你的方法的順序,使其首先到達的葉節點,做你的遞歸前:

def copy(target_folder) 
    new_folder = self.clone 

    # Copy sub-folders recursively 
    self.children.each do |folder| 
    folder.copy(new_folder) unless folder == new_folder 
    end 

    new_folder.parent = target_folder 
    new_folder.save! 
end 

你的問題是,你被重排根目錄下的「文件夾3「文件夾1」開始」。然後你的遞歸調用運行。當它到達'文件夾3'時,它現在具有'文件夾1'作爲孩子,並且循環繼續。

+0

謝謝。是的,我已經嘗試過,但是在那種情況下,我得到了一個錯誤,因爲'before_save'。應該讓我的問題更清楚。 – Mischa 2011-04-17 23:55:59

相關問題