查找并销毁相关记录

Find and destroy dependent records

一段时间以来,我的 Rails 应用进行了多次重写,在某些情况下模型关联不正确。

目前我的 User 模型 has_many :posts 及其 destroy 方法正确地删除了所有相关的 Post,但有时当事情写得不正确时,这并没有发生。我现在只剩下少数 Post 条记录,这些记录会导致错误,因为它们的用户不存在。

手动过滤所有 Post 记录,检查其用户是否确实存在,如果不存在则销毁该 Post 的最有效方法是什么?

我在想象这样的事情:

Post.all.select{ |post| post.user.nil? }.destroy

但这对于数千条记录来说似乎效率极低。我很想知道执行此操作的最佳方法。谢谢!

为什么不能直接在数据库上做?

delete from posts where user_id not in (select id from users);

最快的方法可能是在数据库控制台中的目录中执行此操作,但是如果您有其他依赖关系和需要被解雇的 activerecord 回调,您可以执行以下操作:

Post.where("id in (select p.id from posts p left outer join users u on p.user_id = u.id where u.id is null)").destroy_all

删除孤儿 posts 使用

  • 如果你想破坏与Post和运行回调的依赖关联

    Post.where("user_id NOT IN (?)", User.pluck(:id)).destroy_all
    
  • 如果你只想删除post

    Post.where("user_id NOT IN (?)", User.pluck(:id)).delete_all
    

这是一个很好的 post 关于 finding and deleting orphan records