2013-02-21 75 views
1

我試圖實現基於CSV導入功能: Rails Cast Import CSVRails的導入CSV記錄全部刪除,並重新創建

它的偉大工程的更新和通過查找基於它們的ID記錄,編輯或創建它們的新記錄插入。

但是,它不考慮從CSV文件中刪除的記錄。

我缺乏經驗,我認爲可以解決這個問題的辦法是刪除所有記錄並重建它們。但顯然,這會帶來性能問題。

所以,我想請教你們如何解決這個問題。

+0

在導入之前,您可以將現有記錄的所有id保存到數組中,並且在逐行處理csv時,對於處理的每個記錄,將從該數組中刪除相應的id。之後,您可以處理數組中留下的ids,因爲這些記錄不包含在您的csv中 – jethroo 2013-02-21 09:06:22

回答

1

@ Jethroo的建議非常好。您也可以在處理它們時添加要添加到數組中的項目的ID,然後在現有記錄中運行,如果不在處理的數組中,則刪除它們。 F.E .:

processed_ids = [] 
@csv_row.each do |r| 
    process r 
    processed_ids << r[:id] 
end 

Object.all.each do |o| 
    next if processed_ids.include? o.id 
    o.destroy 
end 

不知道這是否是最有效的方法,因爲你必須通過所有的對象:/。

2

看起來你需要一個排除查詢。

您可以收集row_ids到一個數組,然後刪除所有記錄

ids = [] 
CSV.foreach(file.path, headers: true) do |row| 
ids << row["id"] 
end 

Topic.where('id not in (?)',ids).delete_all 

FYI:How to express a NOT IN query with ActiveRecord/Rails?

這一點,你可以運行正常的CSV導入後。

0

如果您基於CSV文件更新記錄(您只希望在CSV文件中存在記錄),則可以先刪除所有記錄,然後從CSV文件中插入記錄。您可以使用允許後臺處理的smarter_csv寶石。