【问题标题】:update or delete on table "x" violates foreign key constraint "fk_rails_5a7b40847a" on table "x" [duplicate]表“x”上的更新或删除违反了表“x”上的外键约束“fk_rails_5a7b40847a”[重复]
【发布时间】:2017-11-24 08:34:52
【问题描述】:

我正在构建一个 Rails 应用程序 (5.1.1),它具有与之链接的帖子和 cmets 的等效项。

一切似乎都正常,但是当我尝试删除包含 cmets 的帖子时,我收到此错误:

PG::ForeignKeyViolation: ERROR:  update or delete on table "posts" violates foreign key constraint "fk_rails_5a7b40847a" on table "comments"
DETAIL:  Key (id)=(3) is still referenced from table "comments".
: DELETE FROM "posts" WHERE "prototypes"."id" = $1"

这个错误看起来很简单,但我对 rails 和 postgresql 真的很陌生,所以我正在寻求一些帮助!

【问题讨论】:

  • 显示您的Post 型号代码
  • 我想我必须编写一些会自动删除 cmets 的代码?
  • 你是如何删除帖子的?显示控制器代码。
  • 这是固定的家伙,我没有依赖: :destroy 在我的帖子模型中非常感谢

标签: ruby-on-rails ruby postgresql activerecord


【解决方案1】:

这取决于您想对帖子的 cmets 进行什么删除。如果您想级联删除它们,例如:

post.rb

has_many :comments, dependent: :destroy

【讨论】:

  • 太棒了,非常感谢!
【解决方案2】:

更新您的Post 模型中的以下行,如下所示

has_many :comments, dependent: :destroy 

您必须在 Post 模型中提及 dependent: :destroy。因此,当任何postpost.destroy 删除时,它会删除Comment 模型的所有依赖记录。

希望这能解决您的问题

【讨论】:

  • 它解决了我的问题。非常感谢!
  • 欢迎 :) 继续编码
【解决方案3】:

这是因为您的数据库中有一个约束。
我假设表comments中的外键post_id必须存在于关联表posts中。
那肯定是因为您在迁移中使用rails g model Comment post:references 指定了外键关系。

您必须指定删除时如何处理关联模型:

class Post < ActiveRecord::Base
  has_many :comments, dependent: :destroy # destroy associated comments
end

然后调用方法post.destroy而不是你记录上的post.delete

请参阅has_many 了解其他选项

【讨论】:

  • 完美运行!!谢谢!
猜你喜欢
  • 2021-08-04
  • 2021-09-14
  • 2019-03-05
  • 2019-11-05
  • 2018-05-17
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多