我有一个myobject.save!
导致这个错误的情况:
PG::UniqueViolation: ERROR:重复键值违反唯一约束"things_pkey"DETAIL: Key (id)=(12345)已经存在。:插入"事物";("id")取值(12345,…)返回"id">
所以,rails有一个持久化的记录,但试图做一个插入而不是更新,然后在插入中包含id(因为,我猜,在插入的情况下,它不习惯排除任何列)。
进一步在代码中,在同一对象上有一个save!
,在我正在查看的情况下可能会或可能不会触发。关于这个保存,唯一值得注意的是它发生在rescue
块内。我在控制台中做了一些简单的测试,看看如果对象是在救援块中创建的,是否出于某种原因不认为它是持久的,并且没有发现任何这样的行为。
是什么导致rails认为我的对象不是持久化的?
明白了!
我正在用user.things.build
构建对象。用户#things不是一个关联。它是一个返回ActiveRecord::Relation的方法。这个方法最近更改为Things.where(id: ...)
。因此,在构建新对象时,rails会顺从地使用尽可能多的查询。