为什么 rails 认为我的对象没有持久化?

Why does rails think my object isn't persisted?

我遇到 myobject.save! 导致此错误的情况:

PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "things_pkey" DETAIL: Key (id)=(12345) already exists. : INSERT INTO "things" ("id", ...) VALUES (12345, ...) RETURNING "id"

所以,rails 有一个持久化的记录,但尝试执行插入而不是更新,然后在插入中包含 id(因为,我猜,在插入的情况下它不习惯排除任何列)。

在代码的更上方,同一个对象上有一个 save!,在我正在查看的情况下,它可能已被触发,也可能未被触发。这个保存唯一值得注意的是它发生在 rescue 块内。我在控制台中做了一些简单的测试,看看是否出于某种原因,如果一个对象是在救援块中创建的,它就不会被认为是持久的,但没有发现任何这样的行为。

什么可能导致 rails 认为我的对象没有持久化?

想通了!

我正在使用 user.things.build 构建对象。 User#things 不是关联。这是一种 returns 和 ActiveRecord::Relation 的方法。此方法最近更改为 Things.where(id: ...)。所以,rails 在构建新对象时,乖乖地使用了尽可能多的查询。