RoR关联:has_one + has_many依赖者::destroy

时间:2019-07-03 17:26:18

标签: ruby-on-rails ruby-on-rails-5 associations has-many

当我尝试销毁用户时,我不明白为什么会有孤儿记录。 用户 有一个 购物车,其中有很多 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可以胜任这项工作,但看来我错了。我想念什么?

感谢您的时间

1 个答案:

答案 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