【问题标题】:Find and destroy dependent records查找并销毁相关记录
【发布时间】:2017-01-06 18:51:21
【问题描述】:

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

目前我的User 模型has_many :posts 及其destroy 方法正确地删除了所有依赖的Posts,但有时当事情写得不正确时,这并没有发生。我现在留下了一些由于用户不存在而导致错误的 Post 记录。

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

我在想象这样的事情:

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

但这对于数千条记录来说似乎非常低效。我很想知道做到这一点的最佳方法。谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.2 associations has-many model-associations


    【解决方案1】:

    您为什么不能直接在数据库上执行此操作?

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

    【讨论】:

      【解决方案2】:

      最快的方法可能是在 db 控制台中执行它的目录,但如果您有其他依赖关系和需要被解雇的 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
      

      【讨论】:

        【解决方案3】:

        使用删除孤儿帖子

        • 如果你想销毁与Post 的依赖关联并运行回调

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

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

        这是一篇关于finding and deleting orphan records的好帖子

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多