2011-08-02 113 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

相关问题