作者:六月的 | 来源:互联网 | 2023-05-18 13:51
我正在使用Rails和PostgreSQL并且有一个基本的一对多关系,一个Auction
有很多Bid
s.但是,当我尝试删除拍卖(有出价)时,我收到以下错误:
错误:表"update"上的更新或删除违反了表"bid"上的外键约束"fk_rails_43e9021cbf".详细信息:密钥(id)=(1)仍然从表"出价"中引用.
删除没有出价的拍卖会没有错误.
令我困惑的部分是在我的Auction
模型中,我有:
has_many :bids, dependent: :destroy
由于我有一个依赖的destroy子句,为什么我仍然会收到此错误?
编辑:我已经尝试删除整个数据库,然后重新创建/重新迁移所有内容 - 仍然得到相同的错误.
1> Mohamed Ziat..:
从Rails v4.2开始,你可以这样做:
创建迁移以更新外键
20160321165946_update_foreign_key.rb
class UpdateForeignKey
谢谢,我修正了这个错字.
2> John Naegle..:
您使用delete
或destroy
删除对象?我认为你正在使用delete
,你想使用destroy
见http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Delete+or+destroy-3F
3> SUPER USER..:
我的问题是我在尝试删除记录时正在使用@ auction.delete(在我发布的屏幕截图中可见).
删除将忽略我所拥有的任何回调.所以即使我有一个依赖的destroy子句,它也没有被调用 - 因此Rails会抛出一个错误.如果/当我将代码更改为@ auction.destroy时,调用了回调并解决了问题.
参考:
Destroy和Delete之间的区别
4> 小智..:
你偶然使用偏执狂宝石或类似的东西吗?
如果您是bids
,paranoid
而且auctions
不是,您可能会遇到此错误.
这会发生,因为当rails执行时dependent: destroy
,它会软删除出价,但它们实际上仍存在于DB中(它们只是deleted_at
设置了列).因此,外键约束将失败.