当我尝试销毁用户时,我不明白为什么会有孤儿记录。 用户 有一个 购物车,其中有很多 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
:依赖
控制当关联对象的所有者被销毁时会发生什么情况:
- :destroy导致关联对象也被破坏
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。 按顺序执行回调。因此,其他类似的回调可能 影响:depend行为,而:dependent行为可能会影响 其他回调。
- :destroy导致所有关联的对象也被破坏。
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
可以胜任这项工作,但看来我错了。我想念什么?
感谢您的时间
答案 0 :(得分:1)
我在开发机器上遇到了这个问题,然后经过大量的调试和分析,我发现了这个问题的根本原因。 Postgres造成了额外的限制,从而导致了这种情况。 您需要删除约束。您可以通过迁移来做到这一点。
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