查找并销毁相关记录

时间:2017-01-06 18:51:22

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

在一段时间内,我的Rails应用程序有各种重写,在某些情况下还有不正确的模型关联。

目前,我的User模型has_many :posts及其destroy方法正确删除了所有相关的Post,但有时不正确地写入内容时,这种情况并未发生。我现在留下了一些Post记录,这些记录会导致错误,因为他们的用户不存在。

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

我想象的是:

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

但对于成千上万的记录而言,这似乎非常低效。我很想知道最好的方法。谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

最快的方法可能是在数据库控制台中执行此目录,但如果您有其他依赖关系和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

答案 2 :(得分:0)

使用

删除孤立帖子
  • 如果要销毁与#include <iostream> #include <fstream> using namespace std; int main() { string file; ifstream filein(file.c_str()); cout << "Insert Path" << endl; cin >> file; cout << file << endl; filein.open(file.c_str(), ios::in); for (string line; getline(filein, line);) { cout << line << endl; } return 0; } 的从属关联并运行回调

    Post
  • 如果您只想删除帖子

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

以下是关于finding and deleting orphan records

的一篇好文章