Rails 3 - Найти условие для фильтрации нарушенных ссылок на целостность ссылок - PullRequest
1 голос
/ 27 февраля 2012

У меня есть две модели: TimeLog и Task. TimeLog принадлежит Task, а Task имеет множество TimeLog с.

В прошлом некоторые Task были удалены, но соответствующие TimeLog не были удалены (каскадное удаление не работало). Итак, у нас есть несколько сломанных TimeLog с. У них есть task_id, но task_id больше не существует.

У меня есть два вопроса:

1) Я хочу получить все TimeLog от пользователя, но отфильтровывать сломанные.

т.е.

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

2) Я хочу получить все сломанные TimeLog s в консоли, чтобы удалить их вручную.

1027 * т.е. *

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

Как я могу это сделать?

Спасибо

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Добавьте что-то вроде следующего where() в свою цепочку ActiveRelation звонков, чтобы включить любые осиротевшие TimeLog s:

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

... и, очевидно, если вы удалите NOT, вы явно исключите все потерянные записи.

0 голосов
/ 21 января 2015

Задача rake для отслеживания отсутствующих индексов базы данных: https://github.com/eladmeidar/rails_indexes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...