ruby-on-rails - Rails 由于关联而无法保存后在表中创建条目
问题描述
我有一个rails
包含 3 个模型(工作、订单、履行)的应用程序。模型之间的关系是:
- 订单
has one
作业 - 履行
has many
工作
Jobs 表具有以下架构:
create_table "jobs", force: :cascade do |t|
t.string "type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "order_id"
t.integer "fulfillment_id"
end
假设我有订单o
和履行f
o.job = Job.create!(:order_id => o.id, :fulfillment_id => f.id)
这将创建一个与o
和关联的作业f
。
但是如果我再次尝试执行相同的语句,我会得到一个ActiveRecord::RecordNotSaved
错误,但表中存在一个新的 Job 条目。
如果我尝试通过以下方法创建作业,则会看到相同的错误:
o.create_job!(:fulfillment_id => f.id)
堆栈跟踪:
(0.1ms) begin transaction
Order Load (0.2ms) SELECT "orders".* FROM "orders" WHERE "orders"."id" = ? LIMIT ? [["id", 4], ["LIMIT", 1]]
Fulfillment Load (0.2ms) SELECT "fulfillments".* FROM "fulfillments" WHERE "fulfillments"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
Job Create (0.4ms) INSERT INTO "jobs" ("created_at", "updated_at", "order_id", "fulfillment_id") VALUES (?, ?, ?, ?) [["created_at", "2018-07-23 06:27:33.519957"], ["updated_at", "2018-07-23 06:27:33.519957"], ["order_id", 4], ["fulfillment_id", 1]]
(0.8ms) commit transaction
(0.1ms) begin transaction
(0.7ms) rollback transaction
Traceback (most recent call last):
1: from (irb):82
ActiveRecord::RecordNotSaved (Failed to remove the existing associated job. The record failed to save after its foreign key was set to nil.)
为什么这可能?如果关联被破坏,并且事务已经回滚,那么表条目应该已经被删除了吗?
Rails 究竟何时检查失败的关联?如何在不必手动删除表中不正确的条目的情况下从这个错误中解救出来?
解决方案
这是由于您的has_one
关联而发生的。
将失败,因为它正在尝试删除原始订单,但无法删除该订单,因为对 job_id 进行了验证。
这是因为在删除之前,将目标关联的外键设置为 nil,并在目标上执行了保存操作。
推荐阅读
- java - 使用 autosizeColum() 时应用程序正在重新启动
- ios - 如果您关闭设备,推送通知不会通过 UNNotificationServiceExtension
- java - Java 错误:void 无法转换为字符串
- c# - 对象引用未设置为对象的实例 ViewData["Title"] = "Index";
- android - Android Conscrypt 不会抛出 InvalidKeyException
- java - 使用代理集的 curl 获取对 java 的请求不起作用
- typescript - 通过 TypeScript 中的装饰器向类添加属性
- c# - 如何在C#中查找char数组中的字符索引
- javascript - 如何在 React Js 中显示对象的子集
- bash - Kubernetes 部署:preStop 不执行 aws 命令