![](/img/trans.png)
[英]How to not rollback a ActiveRecord transaction in case of failed validation
[英]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.