我試圖使用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文件中顯示時加載,並且自動增量不會產生干擾。
我認爲這是在正確的軌道上,但除非我忽略了一些東西,它並不在那裏。例如。 task.csv中的第一條記錄的id爲「3」(因爲id的「1」和「2」恰好被刪除)。但是,由於自動增量,創建的第一個任務記錄將具有「1」的標識。處理相關的PrecedingTask時,Task.find(行[1])將轉換爲Task.find(3)。它應該是Task.find(1),因爲新的id編號。我想我需要創建一些中間映射。 – Kevin
我看到了,只需將id添加到Task中即可解決您的問題。在這種情況下,preceding_task id並不重要。只有任務需要一個明確的id映射到preceding_task.task_id –
對此解決方案的編輯是否給了你想要的? –