当一个资源创建失败时,Rails ActiveRecord::Base.transaction 不会逆转

问题描述 投票:0回答:1

在我的 Rails 7 应用程序中,我有一个简单的服务用于解析 CSV 以创建收入记录。每份收入都与雇员挂钩,雇员属于雇主。

CSV 的每一行都有

external_ref
,这是员工的字符串。在创建收入之前,我想首先通过
external_ref
找到或创建一个员工。找到或创建员工后,我们就可以创造收入了。

如果收入创建失败,则该员工(如果创建)也应该在 ActiveRecord 事务中被销毁。但是,该员工并未被删除。

我的 CSV 服务类如下:

      data = CSV.read(@file_path, headers: true)
      data.each do |earning_data|
        ActiveRecord::Base.transaction do
          employee_found = Employee.find_or_create_by(earning_data['external_ref'])
          Earning.create(employee: employee_found,
                         earning_date: earning_data['earning_date'],
                         amount: earning_data['amount'])
        end
      end

假设 CSV 的一行有

nil
表示金额,这将触发不创建收入。事实上,当我运行这段代码时,不会产生收入。然而,员工仍在被创建而不是被销毁。

如何保证当收益创建失败时,新创建的员工也被销毁?

我尝试使用

Employee.transaction
Earning.transaction
而不是
ActiveRecord::Base.transaction
。但还是不行。

谢谢!

ruby-on-rails postgresql activerecord transactions rails-activerecord
1个回答
0
投票

您使用的数据库方法(

create
find_or_create_by
)在失败时只是返回 false。您需要在失败时引发异常的
!
版本。

© www.soinside.com 2019 - 2024. All rights reserved.