Электронная почта транзакции ActiveRecord - PullRequest
1 голос
/ 02 августа 2011

Я запускаю библиотеку в моем приложении rails 3, которое выполняет несколько вставок и обновлений для разных моделей. Это похоже на импорт файла списка покупок CSV, который может быть с ошибками, которые прерывают функцию импорта.

Итак, у меня есть что-то вроде этого:

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.

Ответы [ 2 ]

1 голос
/ 02 мая 2012

Я только что нашел это: https://github.com/grosser/ar_after_transaction

Кажется, что это должно элегантно решить эту проблему.

1 голос
/ 02 августа 2011

Что на самом деле вызывает отправку электронной почты?Если вы сохраните это в обратном вызове, например after_save, он не будет отправлять электронные письма, если объект не был сохранен должным образом.Нравится:

after_save :send_notification

def send_notification
  UserNotifier.something.deliver
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...