我試圖實現基於CSV導入功能: Rails Cast Import CSVRails的導入CSV記錄全部刪除,並重新創建
它的偉大工程的更新和通過查找基於它們的ID記錄,編輯或創建它們的新記錄插入。
但是,它不考慮從CSV文件中刪除的記錄。
我缺乏經驗,我認爲可以解決這個問題的辦法是刪除所有記錄並重建它們。但顯然,這會帶來性能問題。
所以,我想請教你們如何解決這個問題。
我試圖實現基於CSV導入功能: Rails Cast Import CSVRails的導入CSV記錄全部刪除,並重新創建
它的偉大工程的更新和通過查找基於它們的ID記錄,編輯或創建它們的新記錄插入。
但是,它不考慮從CSV文件中刪除的記錄。
我缺乏經驗,我認爲可以解決這個問題的辦法是刪除所有記錄並重建它們。但顯然,這會帶來性能問題。
所以,我想請教你們如何解決這個問題。
@ 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
不知道這是否是最有效的方法,因爲你必須通過所有的對象:/。
看起來你需要一個排除查詢。
您可以收集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導入後。
如果您基於CSV文件更新記錄(您只希望在CSV文件中存在記錄),則可以先刪除所有記錄,然後從CSV文件中插入記錄。您可以使用允許後臺處理的smarter_csv寶石。
在導入之前,您可以將現有記錄的所有id保存到數組中,並且在逐行處理csv時,對於處理的每個記錄,將從該數組中刪除相應的id。之後,您可以處理數組中留下的ids,因爲這些記錄不包含在您的csv中 – jethroo 2013-02-21 09:06:22