2011-08-30 20 views
0

我試圖使用FasterCSV導出和導入兩個相關模型。第一個模型是Task,第二個模型是PrecedingTask。任務有許多preceding_tasks。在FasterCSV加載過程中抑制自動增量

如您所料,PrecedingTask使用task_id字段引用任務。

但是,FasterCSV無法從.csv文件數據加載task.id字段。相反,task.id是使用自動增量填充的(正如在運行rails應用程序時通常那樣)。

這打破了Task和PrecedingTask之間的關係。

使用FasterCSV時,有沒有辦法抑制自動增量?如果不是,建議的解決方法是什麼?

下面是相關Rake任務:

def load_tasks 
    csv.foreach("db/preceding_tasks.csv") do |row| 
     PrecedingTask.create(
     :id     => row[0],     
     :task_id    => row[1],   
     :predecessor_id  => row[2], 
     :created_at   => row[3],  
     :updated_at   => row[4] 
     ) 
    end 

    csv.foreach("db/tasks.csv") do |row| 
     Task.create(
     :id     => row[0],     
     :task_sequence  => row[1],   
     :name     => row[2], 
     :default_duration  => row[3],   
     :alert_code   => row[4],  
     :created_at   => row[5],  
     :updated_at   => row[6],  
     :optional    => row[7],  
     :start_trigger  => row[8],   
     :end_trigger   => row[9]  
     ) 
    end 
end 

__ _ __ _ __ UPDATE __ _ __ _ ___

衛生署!

結果我的Rake代碼很好,我不需要做任何關於自動增量的特殊功能。

問題是我沒有在attr_accessible列表中包含Task.id,所以它被忽略。通過該更改,id會在task.csv文件中顯示時加載,並且自動增量不會產生干擾。

回答

1

我想你想要的是這樣的:

def load_tasks 
    csv.foreach("db/tasks.csv") do |row| 
     Task.create(
     :id     => row[0], 
     :task_sequence  => row[1],   
     :name     => row[2], 
     :default_duration  => row[3],   
     :alert_code   => row[4],  
     :created_at   => row[5],  
     :updated_at   => row[6],  
     :optional    => row[7],  
     :start_trigger  => row[8],   
     :end_trigger   => row[9]  
     ) 
    end 

    csv.foreach("db/preceding_tasks.csv") do |row| 
     t = Task.find(row[1]) 
     t.preceding_tasks.create(:predecessor_id => row[2], :created_at => row[3], :updated_at => row[4]) 
    end 
end 

任務的ID將在創建創建,那麼所有你想要做的就是創建一個屬於給任務的preceding_task。 PrecedingTask的task_id和id工作已經爲您處理好了。

+0

我認爲這是在正確的軌道上,但除非我忽略了一些東西,它並不在那裏。例如。 task.csv中的第一條記錄的id爲「3」(因爲id的「1」和「2」恰好被刪除)。但是,由於自動增量,創建的第一個任務記錄將具有「1」的標識。處理相關的PrecedingTask時,Task.find(行[1])將轉換爲Task.find(3)。它應該是Task.find(1),因爲新的id編號。我想我需要創建一些中間映射。 – Kevin

+0

我看到了,只需將id添加到Task中即可解決您的問題。在這種情況下,preceding_task id並不重要。只有任務需要一個明確的id映射到preceding_task.task_id –

+0

對此解決方案的編輯是否給了你想要的? –