Удаление записи нарушает ограничение внешнего ключа - PullRequest
1 голос
/ 10 июля 2019

У меня есть таблица для уведомлений, в которой хранится идентификатор нескольких моделей, поэтому пользователь получает уведомление о действиях, связанных с ними (кто-то опубликовал комментарий к вашей статье).Уведомления не «принадлежат» ничему, кроме пользователя, которому они собираются, однако, они просто ссылаются на идентификаторы вещей.Так что теперь, когда я пытаюсь удалить статью, например, я получаю сообщение об ошибке:

ActiveRecord::InvalidForeignKey (PG::ForeignKeyViolation: ERROR:  update or delete on table "comments" violates foreign key constraint "fk_rails_9268535f02" on table "notifications"

Как я могу настроить его на удаление также любых ссылочных уведомлений?

Моя схема БД дляуведомления:

create_table "notifications", force: :cascade do |t|
t.integer  "recipient_id"
t.integer  "notified_by_id"
t.integer  "glip_id"
t.integer  "article_id"
t.integer  "group_id"
t.integer  "post_id"
t.integer  "comment_id"
t.integer  "notation_id"
t.integer  "response_id"
t.integer  "remark_id"
t.integer  "conversation_id"
t.integer  "message_id"
t.boolean  "read",              default: false
t.datetime "created_at",                        null: false
t.datetime "updated_at",                        null: false
t.integer  "notification_type"
t.index ["article_id"], name: "index_notifications_on_article_id"
t.index ["comment_id"], name: "index_notifications_on_comment_id"
t.index ["conversation_id"], name: "index_notifications_on_conversation_id"
t.index ["glip_id"], name: "index_notifications_on_glip_id"
t.index ["group_id"], name: "index_notifications_on_group_id"
t.index ["message_id"], name: "index_notifications_on_message_id"
t.index ["notation_id"], name: "index_notifications_on_notation_id"
t.index ["notified_by_id"], name: "index_notifications_on_notified_by_id"
t.index ["post_id"], name: "index_notifications_on_post_id"
t.index ["recipient_id"], name: "index_notifications_on_recipient_id"
t.index ["remark_id"], name: "index_notifications_on_remark_id"
t.index ["response_id"], name: "index_notifications_on_response_id"

конец

И мои уведомления Модель:

class Notification < ApplicationRecord
  enum notification_type: { comment: 0, notation: 1, message: 2, feature: 3, marked_helpful: 4,
                            participation: 5, response: 6, remark: 7, follow: 8, unfollow: 9 }
  enum read: { read: true, unread: false }
  belongs_to :notified_by, class_name: 'User'
end

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Это может быть связано с тем, что при удалении article ассоциированные comments удаляются вместе, и существует ограничение внешнего ключа между таблицами комментариев и уведомлений на уровне БД, которое препятствует его удалению.

Я предлагаю добавить dependent: :destroy в Comment модель, если вы хотите, чтобы связанные уведомления были удалены вместе с комментариями

class Comment < ApplicationRecord
  has_many :notifications, dependent: destroy
end

Если вы хотите, чтобы уведомления не удалялись при удалении комментариев

class Comment < ApplicationRecord
  has_many :notifications, dependent: :nullify
end

Для более подробной информации, пожалуйста, посмотрите Разница между зависимость: уничтожить и зависимые:: обнулить

2 голосов
/ 10 июля 2019

Ваш User должен использовать опцию :dependent :

class User < ApplicationRecord
  # ...
  has_many :notifications, foreign_key: :notified_by_id, dependent: :destroy
end

Также следует указать :foreign_key , если вы использовали :class_nameна стороне belongs_to ассоциации.

Теперь, когда вы удаляете User, все уведомления, ссылающиеся на них, также удаляются.

Вы можете повторить тот же процесс дляArticle или любая другая упомянутая модель.

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