代码之家  ›  专栏  ›  技术社区  ›  Ilja KO

删除记录时出现外键约束错误

  •  1
  • Ilja KO  · 技术社区  · 6 年前

    我得到一个外键约束错误,它说明:

    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".
    

    所以我的post表引用了一个用户表条目,但是当用户被删除时,我不希望用户的文章也被删除。所以会发生什么:仍然有一个对不存在的用户的引用。

    我希望在删除用户时断开该关系,并保留用户的日志,也许可以通过将用户引用设为零

    这是我的一个摘录 图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
    

    用户地址 :

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

    邮政银行 :

    class Post < ApplicationRecord
      ...
      belongs_to :user
      ...
    end
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   tadman    6 年前

    通过切换从属链接类型,可以避免删除记录:

    has_many :posts, dependent: :nullify
    

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

    需要注意的是,在我设计的系统中,保留有关已删除用户的信息通常很重要,因此通常情况下,这些用户实际上没有被删除,只是标记为已删除,并通过使用范围和其他测试使其不可见。您还可以将用户的删除级联到对其文章的相同软删除中。

    在任意删除记录之前,请检查您对信息保留的法律要求。您可能需要保留一段时间,在这种情况下 deleted_at 字段可以帮助您。如果它比 n 天,如果这是您必须保留的法定最低限度,则可以安全地清除记录。