Ошибка ограничения внешнего ключа при удалении записи - PullRequest
0 голосов
/ 10 сентября 2018

Я получаю сообщение об ошибке несоответствия внешнего ключа:

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

Итак, моя таблица сообщений ссылается на запись в таблице пользователей, но когда пользователь удаляется, я не хочу, чтобы сообщения пользователя удалялисьтакже.Итак, что происходит: по-прежнему есть ссылка на пользователя, которого не существует.

Я хочу, чтобы это отношение было разорвано при удалении пользователя и сохранить сообщение пользователя, возможно, сделав ссылку на пользователя nil

Вот выдержка из моего schema.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

user.rb :

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

post.rb :

class Post < ApplicationRecord
  ...
  belongs_to :user
  ...
end

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете избежать удаления записей, переключив тип зависимой ссылки:

has_many :posts, dependent: :nullify

, которая переворачивает столбец на NULL и разрывает ссылку.Это также стирает любую информацию о том, кто создал эти сообщения.

Как примечание, в системах, которые я проектирую, часто важно сохранять информацию об удаленных пользователях, поэтому часто бывает, что они на самом деле не удалены, простопомечен как удаленный и сделанный невидимым с помощью областей и других тестов.Вы также можете каскадировать удаление пользователя в то же мягкое удаление его сообщений.

Проверьте произвольные требования к хранению информации, прежде чем произвольно удалять записи.Вам может потребоваться сохранить их в течение определенного периода времени, и в этом случае может помочь поле deleted_at.Если он старше N дней, когда это законный минимум, который вы должны хранить, вы можете безопасно удалить записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...