回滚耙 db:种子 如果引发异常



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

已经发生的场景:

  1. 种子文件需要 4 个不同的 CSV
  2. 4 个 CSV 中只有 3 个上传到暂存服务器
  3. rake db:seed运行了,种子文件在中途爆炸,因为它找不到文件,但在此之前创建了 1000 多个 AR 对象。

理想情况下,我想做这样的事情:

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

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

这是活动记录事务的目的:

事务是保护块,其中 SQL 语句仅是 如果它们都能作为一个原子行动成功,那么它们就会永久存在。经典 示例是两个帐户之间的转账,您只能有一个 如果提款成功,则存款,反之亦然。交易 强制实施数据库的完整性并保护数据免受 程序错误或数据库故障。所以基本上你应该使用 事务块,只要您有许多语句必须 一起执行或根本不执行。

试试这个

ActiveRecord::Base.transaction do
    ...
end

最新更新