2011-08-02 115 views
1

我在我的rails 3應用程序中運行一個lib,它在不同的模型上執行多個插入和更新。這就像導入一個CSV購物清單文件,該文件可能帶有中止導入功能的錯誤。ActiveRecord交易電子郵件

所以我有這樣的事情:

begin 
    ActiveRecord::Base.transaction do 
    @csv.each_with_index do |row, line_number| 
     begin  
     shopping_list_importer.import(row) 
     rescue Exception => e 
     invalid_objects << {:message => e.message, :line_number => line_number+2} 
     end 
    end 
    raise ActiveRecord::StatementInvalid if invalid_objects.present? 
    end 
rescue ActiveRecord::StatementInvalid 
end 

我的問題是,創建一個新的購物清單項目時發送電子郵件的用戶。 當發生一些錯誤時,電子郵件已經發出,並且交易不會阻止。沒關係,我明白爲什麼發生這種情況,我應該在導入後發送電子郵件,但我的問題是,是否有更簡單的方法來執行此操作並繼續使用事務處理塊?

在此先感謝, 安德烈。

回答

1

實際觸發電子郵件發送的是什麼?如果您保留回調像after_save那樣,如果對象未正確保存,它將不會發送任何電子郵件。像:

after_save :send_notification 

def send_notification 
    UserNotifier.something.deliver 
end 
+0

嗯,感謝您的回覆,但這就是我現在的樣子。但是如果在交易中發生任何錯誤,正確的元素已經發送了電子郵件。 – AndreDurao

+0

對。抱歉。我錯過了。如何在導入完成後推遲電子郵件發送?設置一個attr_accessor:skip_notifications可以做到這一點。因此,在導入期間將該標誌分配給對象,並且如果它存在則不發送電子郵件。然後通過導入的對象成功導入循環並觸發'send_notification'方法。 – Grocery

+0

是的,我認爲這樣的東西......但這個訪問器將需要導入後。在某些情況下,我可以有一個非常大的購物清單。我認爲,而不是使用訪問者,我應該有一個布爾「提交」列,讓我列出哪些列表提交沒有失敗,並觸發郵件方法列入成功導入列表,並沒有發送電子郵件。發送後,我將提交的值更新爲true,以便將它們標記爲已發送。 – AndreDurao

相關問題