【问题标题】:Why does rails think my object isn't persisted?为什么rails认为我的对象没有持久化?
【发布时间】:2021-01-27 14:34:04
【问题描述】:

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

PG::UniqueViolation: 错误:重复键值违反唯一约束“things_pkey” 详细信息:键 (id)=(12345) 已存在。 : INSERT INTO "things" ("id", ...) VALUES (12345, ...) RETURNING "id"

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

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

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

【问题讨论】:

  • 您需要发布更多代码以提供上下文。现在我们根本不知道你在哪里打电话给save!(特别是因为你打了两次电话)。发布发生这种情况的整个方法,我相信有人可以提供合理的解释
  • 唉,代码很长,所以我无法轻松地制作有意义的伪代码。它所做的一切都是典型的。分配属性并保存。
  • 很遗憾,我们无法仅根据此处提供的内容提供帮助,因此我建议您至少尝试通过删除所有多余的行来总结代码中的问题。另外,“代码很长”本身就是一个问题。尝试将其分解为更小的功能块,这将使调试变得更加容易。

标签: ruby-on-rails rails-activerecord


【解决方案1】:

想通了!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多