销毁 Active Record 中孤立的多态关联
Destroy orphaned polymorphic association in Active Record
我最近在我的 Rails 应用程序中使用多态关联创建了一个通知系统。一切正常,直到系统停止为某些用户显示通知。我意识到罪魁祸首是一个孤立的通知——Notification.notifiable_id 返回了一个不存在的用户。这是一个图表:
Notification is created on Comment creation
用户模型:
has_many Notifications, dependent: destroy
因此,负责创建通知的用户仍然有可能删除他们的帐户,从而在一端留下孤立的通知记录。
问题:
1.如何删除所有没有找到Notification.notifiable_id的通知?
- 如何防止此问题在将来破坏通知系统?
发帖后我意识到我误解了多态关联。我实际上设置了 Notification.notifiable 来指向用户创建的评论,而不是用户本身。
我通过修改 Comment 模型(以及充当 'notifiable' 的其他模型)解决了问题 #2
has_many :notifications, as: :notifiable, dependent: :destroy
为了您的数据修复
Notification.all.each do |notification|
notification.destroy if notification.notifiable.nil?
end
您的 dependent: :destroy
好像少了一个冒号。当用户记录被销毁时,这会阻止您的通知被正确销毁。
我最近在我的 Rails 应用程序中使用多态关联创建了一个通知系统。一切正常,直到系统停止为某些用户显示通知。我意识到罪魁祸首是一个孤立的通知——Notification.notifiable_id 返回了一个不存在的用户。这是一个图表:
Notification is created on Comment creation
用户模型:
has_many Notifications, dependent: destroy
因此,负责创建通知的用户仍然有可能删除他们的帐户,从而在一端留下孤立的通知记录。
问题: 1.如何删除所有没有找到Notification.notifiable_id的通知?
- 如何防止此问题在将来破坏通知系统?
发帖后我意识到我误解了多态关联。我实际上设置了 Notification.notifiable 来指向用户创建的评论,而不是用户本身。
我通过修改 Comment 模型(以及充当 'notifiable' 的其他模型)解决了问题 #2
has_many :notifications, as: :notifiable, dependent: :destroy
为了您的数据修复
Notification.all.each do |notification| notification.destroy if notification.notifiable.nil? end
您的
dependent: :destroy
好像少了一个冒号。当用户记录被销毁时,这会阻止您的通知被正确销毁。