Ассоциации RoR: has_one + has_many зависимый:: уничтожить - PullRequest
0 голосов
/ 03 июля 2019

Я не понимаю, почему у меня есть записи о сиротах, когда я пытаюсь уничтожить пользователя. A Пользователь имеет одну корзину , которая имеет много CartItem


У пользователя одна корзина:
class User < ApplicationRecord
  has_one :cart, dependent: :destroy
  has_many :cart_items, through: :cart, dependent: :destroy
  has_many :samples, through: :cart_items, source: :cartable, source_type: 'Sample'
  has_many :tracks, through: :cart_items, source: :cartable, source_type: 'Track'
end

: зависимый

Управляет тем, что происходит со связанным объектом при уничтожении его владельца:

  • : уничтожение вызывает уничтожение связанного объекта

https://apidock.com/rails/v5.2.3/ActiveRecord/Associations/ClassMethods/has_one

В корзине много товаров:

class Cart < ApplicationRecord
  belongs_to :user
  has_many :cart_items, dependent: :destroy
  has_many :samples, through: :cart_items, source: :cartable, source_type: 'Sample'
  has_many :tracks, through: :cart_items, source: :cartable, source_type: 'Track'
end

: зависимый

Управляет тем, что происходит со связанными объектами, когда их владелец уничтожен. Обратите внимание, что они реализованы как обратные вызовы и Rails выполняет обратные вызовы в порядке. Поэтому другие подобные обратные вызовы могут влияет на: зависимое поведение, и: зависимое поведение может влиять другие обратные вызовы.

  • : уничтожение приводит к уничтожению всех связанных объектов.

https://apidock.com/rails/v5.2.3/ActiveRecord/Associations/ClassMethods/has_many

И пунктов:

class CartItem < ApplicationRecord
  belongs_to :cart
  belongs_to :cartable, polymorphic: true
end


Я хотел бы иметь возможность уничтожить пользователя с помощью, например, User.last.destroy, но вместо этого у меня есть ошибка:
ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR:  update or delete on table "users" violates foreign key constraint "fk_rails_ea59a35211" on table "carts"
DETAIL:  Key (id)=(227) is still referenced from table "carts".

Я думал, что has_one :cart, dependent: :destroy сделает эту работу, но, похоже, я ошибаюсь. Что мне не хватает?

Спасибо за ваше время

1 Ответ

1 голос
/ 03 июля 2019

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

rails g migration remove_fk_constraints

class RemoveFkConstrains < ActiveRecord::Migration[5.2]
  def up
    execute "ALTER TABLE carts DROP CONSTRAINT fk_rails_ea59a35211;"
  end
end
...