首页 > 解决方案 > Rails 由于关联而无法保存后在表中创建条目

问题描述

我有一个rails包含 3 个模型(工作、订单、履行)的应用程序。模型之间的关系是:

  1. 订单has one作业
  2. 履行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 究竟何时检查失败的关联?如何在不必手动删除表中不正确的条目的情况下从这个错误中解救出来?

标签: ruby-on-railsrails-activerecord

解决方案


这是由于您的has_one关联而发生的。

将失败,因为它正在尝试删除原始订单,但无法删除该订单,因为对 job_id 进行了验证。

这是因为在删除之前,将目标关联的外键设置为 nil,并在目标上执行了保存操作。

请参考https://github.com/rails/rails/issues/17325


推荐阅读