ActiveRecord事务在失败时不回滚

时间:2014-11-19 09:16:41

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

我正在尝试使用ActiveRecord::Base.transaction来确保一次创建CustomerCustomerAccountStockNotification,或者根本不创建 none如果其中一个失败

这是我的交易
stock_notification.rb:

  validates_presence_of :email

  def self.make parameters
    ActiveRecord::Base.transaction do
      shop_id = ProductVariant.find(parameters[:product_variant_id]).shop_id
      parameters[:customer_account_id] = CustomerAccount.find_or_make!(parameters[:email], shop_id).id
      @stock_notification = StockNotification.create(parameters) # reference A
    end
    @stock_notification
  end

你可能也需要这个 customer_account.rb:

  def self.find_or_make! email, shop_id
    customer = Customer.where(email: email).first_or_create!
    CustomerAccount.where(shop_id: shop_id, customer_id: customer.id).first_or_create!
  end

如果我使用空白电子邮件致电StockNotification.make,则create失败(参考A)并且未创建库存通知,但问题是Customer / {{1}仍然在被创造。

所以CustomerAccount根本没有完成它的工作,或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

是的。如果引发异常,事务将失败。您应该不使用create,而是create!,以便在出现故障时执行此操作。 See here