私は別のモデルでいくつかの挿入と更新を実行する私のレール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。
mmmご返信ありがとうございますが、それは私が今持っているものです。しかし、トランザクションでエラーが発生した場合、正しい要素がすでに電子メールを送信しています。 – AndreDurao
右。ごめんなさい。私は逃しました。インポートが完了した後で電子メールの送信を延期するのはどうですか? attr_accessorを設定すると、skip_notificationsがそれを行います。そのため、インポート中にそのフラグをオブジェクトに割り当て、存在する場合は電子メールを送信しません。その後、インポートされたオブジェクトを介してインポートを成功させ、 'send_notification'メソッドを起動します。 – Grocery
私はこれのようなものを考えました...しかし、このアクセサーはインポート後に必要になります。場合によっては、非常に大きな買い物リストを持つことができます。私はアクセサを使用する代わりに、リストが失敗せずにコミットされたブール値の "コミットされた"列を持っていて、成功してインポートされたリストにメールメソッドをトリガーし、電子メールがまだ送信されていないと考えました。送信後、コミットされた値がtrueに更新され、送信されたとマークされます。 – AndreDurao