在我的 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
。但还是不行。
谢谢!
您使用的数据库方法(
create
和find_or_create_by
)在失败时只是返回 false。您需要在失败时引发异常的 !
版本。