在一段时间内,我的Rails应用程序有各种重写,在某些情况下还有不正确的模型关联。
目前,我的User
模型has_many :posts
及其destroy
方法正确删除了所有相关的Post
,但有时不正确地写入内容时,这种情况并未发生。我现在留下了一些Post记录,这些记录会导致错误,因为他们的用户不存在。
手动过滤所有Post记录的最有效方法是什么,检查其用户是否实际存在,如果没有销毁该帖子?
我想象的是:
Post.all.select{ |post| post.user.nil? }.destroy
但对于成千上万的记录而言,这似乎非常低效。我很想知道最好的方法。谢谢!
答案 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