簡體   English   中英

在Ctrl + C中斷的情況下,如何在Rake任務中使用ActiveRecord事務進行回滾

[英]How do I use an ActiveRecord Transaction in a Rake Task to rollback in the case of a Ctrl+C interrupt

我正在寫一個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時將所有這些包裝在將回滾的事務中,或者它將完成循環,更新階段,然后退出而不是轉到下一個要關聯的項目

您可以使用transaction塊將事物包裝在transaction 舉個例子:

ActiveRecord::Base.transaction do
    # create relation 1
    # create relation 2
    # Ctrl+C
    # create relation 3
end

如果未到達end ,則不會應用SQL COMMIT ,這意味着不會創建上述任何關系。

值得注意的是,您也可以使用像ItemRelation.transaction這樣的東西,但事務不是特定於模型的,所以它的工作原理相同。

可以在“ Active Record Transactions”頁面上找到更多信息。

收到Ctrl + C后,無法等待並完成某些操作; 基於交易的方法是可行的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM