2017-02-24 243 views
1

假設我有一個包含要存儲在db.I中的數據的excel表格,我使用roo gem併成功插入了excel表格中的數據。現在我試圖驗證。 假設我的excel表爲:將excel表格中的數據存儲到數據庫中

s.no name age 
1 abc  12 
2 def  qwer 
3 asd  23 

當我上傳此片材中,2行數據是輥支持和1,3-行的數據存儲在DB中。 我想要做的是如果回滾操作發生,那麼其餘的記錄不應該存儲在db.i.e行3數據不應該存儲爲第2行roll-backed.Any幫助表示讚賞。謝謝。

更新: 這是我在控制器代碼:

def fetch_excel_data 

ex = Roo::Excel.new("/desktop/abc.xls") 
ex.default_sheet = ex.sheets[0] 
2.upto(ex.last_row) do |line| 
    name = ex.cell(line,2) 
    age = ex.cell(line,ex.last_column) 
    byebug 
    @product = Product.create(:name => name,:age => age) 
    @product.save! 
    flash[:success] = "data is stored successfully" 
end 
end 

我想回滾整個Excel工作表不僅records..Is有沒有辦法這樣做呢?

+0

你可以顯示你正在使用的代碼來解析和插入工作表嗎? – Nobita

+0

如果任何記錄無效並且不會保存更多記錄,則可以中斷循環 –

回答

1

可以打破循環,如果任何記錄是無效的,將不會進一步節省記錄

喜歡的東西

CSV.foreach("file.csv", headers: true) do |row| 
    user = User.new(name: row['name'], age: row['age']) 
    break unless user.valid? 
    user.save 
end 

編輯:

從@Rais建議你可以考慮幫助做這樣的事情

User.transaction do 
    CSV.foreach("file.csv", headers: true) do |row| 
    User.create!(name: row['name'], age: row['age']) 
    end 
end 
+0

這適用於我希望回滾下一條記錄的情況。但是我想回滾整個sheet.Is有任何解決方案嗎?@Deepak – Harshini

0

我想補充,你可以使用ActiveRecord Transactions

從軌API報價達到原子文檔 -

事務將是SQL語句僅 永久性的,如果他們都可以作爲一個原子操作成功保護塊。典型的 示例是兩個賬戶之間的轉賬,如果取款成功,您只能有 存款,反之亦然。事務 強制執行數據庫的完整性,並防止程序錯誤或數據庫崩潰的數據。所以基本上你應該使用 交易區塊,只要你有一些必須 一起執行或根本不執行的語句。

例如:

ActiveRecord::Base.transaction do 
    david.withdrawal(100) 
    mary.deposit(100) 
end 

這個例子將只從大衛拿錢,並把它給瑪麗,如果 沒有撤出,也不存引發異常。例外情況是 強制ROLLBACK將數據庫返回到 事務開始之前的狀態。但請注意,對象不會有 其實例數據返回到它們的事務前狀態。

+0

不適用'Model.create' –

+1

啊你必須做'創建!' –

相關問題