将excel表中的数据存储到ror中的db

时间:2017-02-24 11:50:14

标签: mysql ruby-on-rails roo-gem

假设我有一个excel表,其中包含要存储在db.I中的数据,使用了roo gem并成功插入了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。感谢任何帮助。谢谢。

更新: 这是我在控制器中的代码:

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表,而不仅仅是记录。有什么方法可以这样做吗?

2 个答案:

答案 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

答案 1 :(得分:0)

只需添加,您就可以使用ActiveRecord Transactions

实现原子性

引用rails api文档 -

  

事务是只有SQL语句的保护块   永久性的,如果他们都可以成为一个原子行动。经典   例如,两个帐户之间的转移,你只能有一个   如果撤回成功则存款,反之亦然。交易   强制执行数据库的完整性并防范数据   程序错误或数据库故障。所以基本上你应该使用   每当你有许多必须的语句时,事务块   一起执行或根本不执行。

例如:

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

这个例子只会从大卫那里取钱,然后把它交给玛丽   撤回或存款都不会引发例外。例外情况会   强制ROLLBACK将数据库返回到之前的状态   交易开始了。但请注意,对象不会有   他们的实例数据返回到事务前的状态。