Rails 3:在单个事务中包装ActiveRecord操作和外部信用卡

时间:2012-07-11 22:42:39

标签: ruby-on-rails-3 activerecord transactions activemerchant

我正在使用ActiveMerchant来处理可能成功或失败的信用卡交易,这是涉及使用ActiveRecord处理的一些内部会计的更大交易的一部分。如果部件发生故障,我不清楚如何回滚整个交易。

我有付款模式和积分模型 - 用户的积分转换为美元,用于减少付款。所以我需要做这些事情:

  • 与金额和分数有关的若干验证
  • 保存积分交易:借记用户帐户,信用内部帐户
  • 从积分
  • 向信用卡收取少量付款金额
  • 保存此付款数据
  • 保存信用卡交易结果(无论成功还是失败)
  • 如果一切正常,请发送电子邮件给用户

我看到ActiveRecord::Transactions如何工作,并假设我可以使用after_commit(和after_rollback)回调来处理电子邮件发送给用户的内容。

但是,如何使失败的信用卡交易导致失败的AR save导致同样的回滚?如果我的非AR交易失败,是否像调用raise ActiveRecord::Rollback一样容易?上面链接的文档中有一节让我对此感到紧张(与不能跨多个数据库连接的事务有关)。

Rails 3.2.5,MySQL 5.1(InnoDB),Ruby 1.9.3

1 个答案:

答案 0 :(得分:2)

您的ActiveMerchant调用是指外部服务器,因此不会影响您的ActiveRecord事务。随意提出ActiveRecord::Rollback