【问题标题】:ActiveRecord transaction e-mailsActiveRecord 交易电子邮件
【发布时间】:2012-05-02 08:06:03
【问题描述】:

我正在我的 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

我的问题是,当创建一个新的购物清单项目时,它会为用户发送一封电子邮件。 当发生一些错误时,电子邮件已经发送并且交易不会阻止它。没关系,我明白为什么会这样,我应该在导入后发送电子邮件,但我的问题是有没有更简单的方法可以做到这一点并继续使用交易块?

提前致谢, 安德烈。

【问题讨论】:

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


    【解决方案1】:

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

    after_save :send_notification
    
    def send_notification
      UserNotifier.something.deliver
    end
    

    【讨论】:

    • 嗯,感谢您的回复,但这就是我现在所拥有的。但是,如果交易发生任何错误,正确的元素已经发送了电子邮件。
    • 对。对不起。我错过了。导入完成后推迟发送电子邮件怎么样?设置一个 attr_accessor :skip_notifications 就可以了。因此,在导入期间将该标志分配给对象,如果存在则不要发送电子邮件。然后在导入成功后循环导入对象并触发send_notification方法。
    • 是的,我想是这样的...但是导入后将需要此访问器。在某些情况下,我可以有一个非常大的购物清单。我认为与其使用访问器,我应该有一个布尔“已提交”列,它可以让我知道哪些列表已提交而没有失败,并触发邮件方法发​​送到已成功导入且尚未发送电子邮件的列表。发送后,我将提交的值更新为 true,因此它们被标记为已发送。
    【解决方案2】:

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

    看来它应该优雅地解决这种问题。

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 2013-02-12
      • 1970-01-01
      • 2013-11-21
      • 2014-05-30
      • 2015-10-13
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多