【发布时间】:2020-01-31 10:16:36
【问题描述】:
我有一个带有 :dependent => :destroy 的活动记录关联设置,它按预期工作。 然后我发现由于性能原因我需要使用delete而不是destroy,所以我只是根据关联将destroy更改为delete_all/delete。
当我尝试删除时:
shop.shop_snapshots.completed.last.delete
我收到错误消息:
ActiveRecord::InvalidForeignKey (PG::ForeignKeyViolation: ERROR: update or delete on table "shop_snapshots" violates foreign key constraint "fk_rails_c24b24adaf" on table "inventory_items"
但是为什么会这样 - 我相信我在快照上进行了正确的设置:
has_many :inventory_items, :dependent => :delete_all
它对破坏有效,所以我做错了什么?
谢谢 /路易丝
【问题讨论】:
-
这能回答你的问题吗? Difference between Destroy and Delete
-
不完全-它说“删除只会从数据库中删除当前对象记录,但不会从数据库中删除其关联的子记录”。这意味着只有我的快照被删除,而不是关联的inventory_items,这解释了错误消息。但是为什么 Rails 支持设置 :dependent => :delete_all,如果它不支持对子级的级联删除 - 那么“:dependent => :delete_all”将不起作用?
-
如果你打电话给
destroy而不是delete,我相信它会起作用 -
是的,使用
destroy已经按照我的描述工作了——但我不想使用destroy,因为我需要delete提供的更好的性能。 -
请再次阅读第一条评论中链接的文本:只有
destroy考虑了:dependent关联操作。delete只能提供更好的性能因为它跳过回调和依赖关联检查。
标签: ruby-on-rails activerecord associations cascading-deletes