2010-07-13 62 views
2

我在寫一個導入例程,它允許用戶上傳CSV文件來加載他們的數據庫。 CSV的每一行對應於模型導入 - csv到activerecord - 在Rails中的錯誤處理

我正在使用FasterCSV來讀取文件並將數據拆分成單獨的模型,這很好。我只是無法決定處理錯誤的最佳方法。

現在我有這個打算,但它確實似乎是錯誤的我:

def import(collection) 
    begin 
    self.transaction do 
     collection.collect{|object| object.save!} 
    end 
    rescue ActiveRecord::RecordInvalid => invalid 
    return false 
    end 

    return true 
end 

有沒有一種更好的方式保存的模型的集合?

回答

4

在循環中使用異常會導致所有類型的麻煩你想追查有問題的記錄。你可能要做的就是儘量將它們全部保存起來,但是報告出錯的那些人:

def import(collection) 
    failed = nil 

    transaction do 
    failed = collection.reject { |r| r.save } 

    unless (failed.empty?) 
     raise ActiveRecord::Rollback 
    end 
    end 

    failed 
end 

這假設你有興趣看看錯誤。如果有任何記錄失敗,它們將以數組形式返回。否則,你會得到一個零,這意味着沒有錯誤。

如果你不在乎,你總是可以只是做一個快速和骯髒的節省:

def import(collection) 
    transaction do 
    collection.each(&:save!) 
    end 
end 

此時會彈出一個ActiveRecord :: RecordInvalid例外的第一次失敗。

0

對於這個問題,我認爲更好的方法是你的。也許並非所有的記錄都在csvaré中有效,並且那些不重要的記錄(記錄它們以便知道錯誤)