我在我的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
我的问题是,创建一个新的购物清单项目时发送电子邮件的用户。 当发生一些错误时,电子邮件已经发出,并且交易不会阻止。没关系,我明白为什么发生这种情况,我应该在导入后发送电子邮件,但我的问题是,是否有更简单的方法来执行此操作并继续使用事务处理块?
在此先感谢, 安德烈。
嗯,感谢您的回复,但这就是我现在的样子。但是如果在交易中发生任何错误,正确的元素已经发送了电子邮件。 – AndreDurao
对。抱歉。我错过了。如何在导入完成后推迟电子邮件发送?设置一个attr_accessor:skip_notifications可以做到这一点。因此,在导入期间将该标志分配给对象,并且如果它存在则不发送电子邮件。然后通过导入的对象成功导入循环并触发'send_notification'方法。 – Grocery
是的,我认为这样的东西......但这个访问器将需要导入后。在某些情况下,我可以有一个非常大的购物清单。我认为,而不是使用访问者,我应该有一个布尔“提交”列,让我列出哪些列表提交没有失败,并触发邮件方法列入成功导入列表,并没有发送电子邮件。发送后,我将提交的值更新为true,以便将它们标记为已发送。 – AndreDurao