2011-08-02 10 views
1

私は別のモデルでいくつかの挿入と更新を実行する私のレール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 

私の問題は、新しいショッピングリスト項目が作成されたとき、それは、ユーザーの電子メールを送信していることである:

は、だから私はこのようなものを持っています。 エラーが発生した場合、電子メールはすでに送信されており、トランザクションによってブロックされません。なぜそれが起こるのか分かりましたが、インポート後に電子メールを送信する必要がありますが、これを実行してトランザクションブロックを使用するより簡単な方法がありますか?

ありがとうございます。 Andre。

答えて

1

電子メール送信を実際にトリガーするものは何ですか? after_saveのようなコールバックでそれを保持すると、オブジェクトが正しく保存されていないと電子メールを送信しません。以下のような:それはエレガントにこの種の問題を解決する必要があるように思えhttps://github.com/grosser/ar_after_transaction

after_save :send_notification 

def send_notification 
    UserNotifier.something.deliver 
end 
+0

mmmご返信ありがとうございますが、それは私が今持っているものです。しかし、トランザクションでエラーが発生した場合、正しい要素がすでに電子メールを送信しています。 – AndreDurao

+0

右。ごめんなさい。私は逃しました。インポートが完了した後で電子メールの送信を延期するのはどうですか? attr_accessorを設定すると、skip_notificationsがそれを行います。そのため、インポート中にそのフラグをオブジェクトに割り当て、存在する場合は電子メールを送信しません。その後、インポートされたオブジェクトを介してインポートを成功させ、 'send_notification'メソッドを起動します。 – Grocery

+0

私はこれのようなものを考えました...しかし、このアクセサーはインポート後に必要になります。場合によっては、非常に大きな買い物リストを持つことができます。私はアクセサを使用する代わりに、リストが失敗せずにコミットされたブール値の "コミットされた"列を持っていて、成功してインポートされたリストにメールメソッドをトリガーし、電子メールがまだ送信されていないと考えました。送信後、コミットされた値がtrueに更新され、送信されたとマークされます。 – AndreDurao

1

私はこれを見つけました。

関連する問題