首页 > 解决方案 > 为什么rails认为我的对象没有持久化?

问题描述

我有一种情况myobject.save!导致此错误:

PG::UniqueViolation:错误:重复键值违反唯一约束“things_pkey”详细信息:键 (id)=(12345) 已存在。:插入“事物”(“id”,...)值(12345,...)返回“id”

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

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

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

标签: ruby-on-railsrails-activerecord

解决方案


弄清楚了!

我正在用user.things.build. User#things 不是关联。这是一个返回 ActiveRecord::Relation 的方法。这种方法最近已更改为Things.where(id: ...). 因此,Rails 在构建新对象时尽可能多地使用查询。


推荐阅读