为什么 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 在构建新对象时,乖乖地使用了尽可能多的查询。
我遇到 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 在构建新对象时,乖乖地使用了尽可能多的查询。