我的种子文件运行了相当多的csv文件,做了一些检查并相应地创建了各种ActiveRecord记录。在测试所有这些文件时,我终于认为我已经拥有它并运行rake db:seed
但是如果出现问题,我希望到目前为止已经创建的文件进行回滚。
已经发生的情景:
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
我想我可以实现一些自定义的东西,但我在rails指南上找不到任何关于此的内容。
答案 0 :(得分:2)
这是Active Record Transactions的目的:
事务是只有SQL语句的保护块 永久性的,如果他们都可以成为一个原子行动。经典 例如,两个帐户之间的转移,你只能有一个 如果撤回成功则存款,反之亦然。交易 强制执行数据库的完整性并防范数据 程序错误或数据库故障。所以基本上你应该使用 每当你有许多必须的语句时,事务块 一起执行或根本不执行。
试试这个
ActiveRecord::Base.transaction do
...
end