查找并销毁相关记录
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
一段时间以来,我的 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