删除记录时外键约束错误

时间:2018-09-10 17:47:53

标签: ruby-on-rails

我收到一个外键约束错误,内容如下:

name

所以我的Post表引用了一个User表条目,但是当User被删除时,我也不想删除该用户的Posts。那么会发生什么:仍然存在对不存在的用户的引用。

我希望在删除用户时打破这种关系,并通过将用户引用设为nil来保留用户的帖子

这是我 schema.rb

的摘录
ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR:  update or delete on table "users" violates foreign key constraint "fk_rails_5b5ddfd518" on table "posts"
DETAIL:  Key (id)=(950961012) is still referenced from table "posts".

user.rb

  create_table "posts", force: :cascade do |t|
    t.bigint "user_id"
    t.string "title"
    t.text "body"
    t.string "category"
    t.string "slug"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["category"], name: "index_posts_on_category"
    t.index ["slug"], name: "index_posts_on_slug", unique: true
    t.index ["user_id"], name: "index_posts_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "password_digest"
    t.string "slug"
    t.string "remember_digest"
    t.boolean "admin", default: false
    t.string "activation_digest"
    t.boolean "activated", default: false
    t.datetime "activated_at"
    t.string "reset_digest"
    t.datetime "reset_sent_at"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["name"], name: "index_users_on_name", unique: true
    t.index ["slug"], name: "index_users_on_slug", unique: true
  end

post.rb

class User < ApplicationRecord
  ...
  has_many :posts
  ...

1 个答案:

答案 0 :(得分:2)

您可以通过切换相关链接类型来避免删除记录:

has_many :posts, dependent: :nullify

将列翻转到NULL并断开链接。这也会删除有关谁创建这些帖子的任何信息。

请注意,在我设计的系统中,保留有关已删除用户的信息通常很重要,因此通常情况下实际上并未删除用户,只是将它们标记为已删除,并通过使用范围和其他测试将其隐藏。您还可以将用户的删除级联为对其帖子的相同软删除。

在任意删除记录之前,请检查法律对信息保留的要求。您可能需要保留一段时间,在这种情况下,deleted_at字段会有所帮助。如果该日期早于 N 天(这是您必须保留的最低法定天数),则可以安全地清除记录。