如果引发异常,则回滚rake db:seed

时间:2014-12-10 16:05:35

标签: ruby-on-rails ruby activerecord

我的种子文件运行了相当多的csv文件,做了一些检查并相应地创建了各种ActiveRecord记录。在测试所有这些文件时,我终于认为我已经拥有它并运行rake db:seed但是如果出现问题,我希望到目前为止已经创建的文件进行回滚。

已经发生的情景:

  1. 种子文件需要4种不同的CSV
  2. 4个CSV中只有3个上传到登台服务器
  3. rake db:seed被运行,种子文件中途爆炸,因为它无法找到文件,但在此之前创建了超过1000个AR对象。
  4. 理想情况下,我想做类似的事情:

    begin
      CSV.readlines(file1)
      CSV.readlines(file2)
      CSV.readlines(file3)
      CSV.readlines(file4)
    rescue
      # raise an error
      # rollback all objects created prior to error
    end
    

    我想我可以实现一些自定义的东西,但我在rails指南上找不到任何关于此的内容。

1 个答案:

答案 0 :(得分:2)

这是Active Record Transactions的目的:

  

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

试试这个

ActiveRecord::Base.transaction do
    ...
end