ActiveRecord交易电子邮件

时间:2011-08-02 14:50:55

标签: ruby-on-rails-3 email transactions

我正在我的rails 3应用程序上运行一个lib,它可以在不同的模型上执行多次插入和更新。这就像导入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

我的问题是,当创建新的购物清单项时,它会为该用户发送一封电子邮件。 当发生一些错误时,电子邮件已经被发送,并且事务不会阻止它。我可以理解为什么会发生这种情况,我应该在导入后发送电子邮件,但我的问题是,是否有更简单的方法来执行此操作并继续使用事务块?

提前致谢, 安德烈。

2 个答案:

答案 0 :(得分:1)

究竟是什么触发了电子邮件发送?如果您将其保留在after_save之类的回调中,则如果未正确保存对象,则不会发送任何电子邮件。像:

after_save :send_notification

def send_notification
  UserNotifier.something.deliver
end

答案 1 :(得分:1)

我刚发现:https://github.com/grosser/ar_after_transaction

似乎应该优雅地解决这类问题。