2017-02-24 244 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

啊你必须做'创建!' –

相关问题