我收到一个外键约束错误,内容如下:
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
...
答案 0 :(得分:2)
您可以通过切换相关链接类型来避免删除记录:
has_many :posts, dependent: :nullify
将列翻转到NULL
并断开链接。这也会删除有关谁创建这些帖子的任何信息。
请注意,在我设计的系统中,保留有关已删除用户的信息通常很重要,因此通常情况下实际上并未删除用户,只是将它们标记为已删除,并通过使用范围和其他测试将其隐藏。您还可以将用户的删除级联为对其帖子的相同软删除。
在任意删除记录之前,请检查法律对信息保留的要求。您可能需要保留一段时间,在这种情况下,deleted_at
字段会有所帮助。如果该日期早于 N 天(这是您必须保留的最低法定天数),则可以安全地清除记录。