Rails 3 - 查找条件以过滤损坏的参考完整性关联

时间:2012-02-27 19:56:28

标签: ruby ruby-on-rails-3 activerecord

我有两个模型:TimeLogTaskTimeLog属于TaskTaskTimeLog个。

过去有些Task已被删除,但相应的TimeLog未被删除(级联删除无效)。所以我们有一些破碎的TimeLog。它们确实有task_idtask_id不再存在。

我有两个问题:

1)我想从用户那里获得所有TimeLog,但是过滤掉了那些。{1}}。

TimeLog.find(:all, :conditions => ['time_log.user_id = ? and <time_log.task_id exists>])

2)我想让控制台中所有损坏的TimeLog手动删除它们。

TimeLog.find(:all, :conditions => [<!time_log.task_id exists>])

我该怎么做?

由于

2 个答案:

答案 0 :(得分:3)

在您的where()来电链中添加以下ActiveRelation之类的内容,以包含任何孤立的TimeLog

.where('NOT EXISTS SELECT * FROM tasks where tasks.id = timelogs.task_id')

...显然,如果删除NOT,您将明确排除任何孤立的记录。

答案 1 :(得分:0)

用于跟踪缺少的数据库索引的rake任务:https://github.com/eladmeidar/rails_indexes