2015-04-16 70 views
3

我想要做這樣的事情:您可以手動管理事務提交/回滾嗎?

["START", "a", "b", "c", "STOP", "START", "d", "e", "STOP"].each do |message| 
    if message == "START" 
    Transaction.begin 
    elsif message == "STOP" 
    Transaction.commit if Transaction.active? 
    else 
    begin 
     Message.create!(body: message) 
    rescue 
     Transaction.rollback 
    end 
    end 
end 

總之,我有「消息」的流,我想transactionalise該流的部分。

每當「START」出現在流,一個新的事務開始。每當出現「停止」時,交易都會被提交。

我正在努力與交易。

我可以看到我能做的ActiveRecord :: Base.transaction做...結束,但不會在這種情況下工作,除非我批了一切,在這裏是因爲流不可能的。

我看到有一個埋在ActiveRecord中的事務管理器,我可能會使用(https://github.com/rails/rails/blob/0d76ab9c6f01e6390ba8878a296ff9d3ac6b9aa8/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb),但是我還沒有能夠讓我的測試通過它。

我認爲問題的一部分,也是RSpec中的事務夾具干涉,但禁用這些似乎並沒有任何解決的問題。

任何幫助,將不勝感激。

感謝

+0

您能否給一些更多的數據?你在掙扎什麼?也許顯示規格失敗。 –

回答

2

我應該這樣做:

messages.chunk {|value| value != 'START' && value != 'STOP'}.each do |is_data, bodies| 
    if is_data 
    Message.transaction do 
     bodies.each {|body| Message.create(body: body)} 
    end 
    end 
end 

的第一步是使用chunk到組的消息。這是一對數組。如果這個對的第一個值是真,那麼第二個值就是這個體的數組,如果不是,那麼這個體就是真的假。隨着數據如此重組,使用現有的交易方法變得微不足道。

0

你可以管理事務通過以下方式

manager = ActiveRecord::Base.connection.transaction_manager 
... 
manager.begin_transaction 
... 
manager.commit_transaction 
... 
manager.rollback_transaction 

或在您的情況

manager = ActiveRecord::Base.connection.transaction_manager 
["START", "a", "b", "c", "STOP", "START", "d", "e", "STOP"].each do |message| 
    if message == "START" 
    manager.begin_transaction 
    elsif message == "STOP" 
    manager.commit_transaction 
    else 
    begin 
     Message.create!(body: message) 
    rescue 
     manager.rollback_transaction 
    end 
    end 
end 
相關問題