2009-03-16 3 views
1

Итак, вот быстрый вопрос. Я использую Rails с огромной старой базой данных, и у нее много сломанных внешних ключей, которые нужно обрабатывать как nils.Разбитые внешние ключи в Rails

Так что, когда я делаю: Foo.find (: все,: условия => {...},: включить =>: бар)

Rails с подключением всех бары с SELECT * FROM баров WHERE ID IN (...). Пока все хорошо, всего два запроса sql.

Теперь проблема в том, что для сломанных fks, когда я пытаюсь сделать foo.bar позже, Rails пытается восстановить панель с помощью SELECT * FROM bars WHERE id = broken_id. Затем он возвращает nil (правильно для меня), но все эти SELECT id = оказываются серьезной проблемой производительности, так как он бомбардирует mysql слишком большим количеством запросов sql.

Любой простой способ проверить, если foo.bar уже установлен, и если он не просто приводит к нулю?

ответ

1

Вы можете использовать метод loaded?, чтобы проверить, если ассоциация была загружена:

foo.bar.loaded? 

Если вы знаете, за то, что вы использовали :include и foo.bar.loaded? возвращается false тогда вы упали над разбитой F-кнопки, пропустите этот foo.bar.

Смежные вопросы