Ruby on rails 在使用Ctrl+的情况下,如何在Rake任务中使用ActiveRecord事务回滚;C中断

Ruby on rails 在使用Ctrl+的情况下,如何在Rake任务中使用ActiveRecord事务回滚;C中断,ruby-on-rails,activerecord,transactions,rake,interrupt,Ruby On Rails,Activerecord,Transactions,Rake,Interrupt,我正在编写一个rake任务,它在我的数据库中创建记录,并且可以无限期地运行。任务的一个方面是在模型之间创建多对多关联。如果我在任务向联接表添加条目时退出该任务,它将无法完成与该模型的关联。以下是任务中的一些代码: (1..100).each do |page| related = Nokogiri::HTML(open(url + "item/#{item.id}/related/#{page}")) related.css('.box').each do |box|

我正在编写一个rake任务,它在我的数据库中创建记录,并且可以无限期地运行。任务的一个方面是在模型之间创建多对多关联。如果我在任务向联接表添加条目时退出该任务,它将无法完成与该模型的关联。以下是任务中的一些代码:

(1..100).each do |page|

    related = Nokogiri::HTML(open(url + "item/#{item.id}/related/#{page}"))

    related.css('.box').each do |box|
      id = box.css('a').first.attr(:href).scan(/\/(\d+)\//)[0][0].to_i
      title = box.css('p.title a').text
      related_item = Item.create :title => title, :foreign_id => id
      ItemRelation.create :item => item, :related_item => related_item
    end

end

item.update_attributes :stage => ItemStage::RELATED
在这里,我遍历相关项的所有页面,并在当前项之间创建一个ItemRelation(该循环位于另一个循环项的循环内,这是'item'变量的来源)。以及我从这些网页上得到的所有相关信息

如果我在迭代这些页面时退出程序,那么当前项目将不会完成,并且阶段也不会在最后更新


那么,我如何将所有这些封装在一个事务中,当我按Ctrl+C键时,该事务将回滚,或者它将完成循环,更新阶段,然后退出,而不是转到下一个要关联的项中

您可以使用
事务
块将事务封装在一个事务中。例如:

ActiveRecord::Base.transaction do
    # create relation 1
    # create relation 2
    # Ctrl+C
    # create relation 3
end
如果未达到
end
,则不会应用SQL
COMMIT
,这意味着不会创建上述任何关系

值得注意的是,您也可以使用类似于
itemrationship.transaction
,但事务不是特定于模型的,因此其结果是相同的

更多信息可在页面上找到

在收到Ctrl+C后,无法等待并完成某件事情;基于事务的方法是可行的