Поработав над этим вопросом некоторое время, я не думаю, что это часть основной философии Rails, согласно которой внешние ключи не должны применяться в базе данных.
Существуют валидации и проверки на уровне приложений, чтобы обеспечить простые, быстрые, удобочитаемые проверки (например, сообщения об ошибках), которые работают в 99,99% случаев. Если вашему приложению требуется нечто большее, вы должны использовать ограничения уровня базы данных.
Я думаю, что эта «философия» возникла из-за оригинальной используемой среды тестирования: внешние ключи оказались просто гигантскими хлопотами при использовании осветителей. Это как когда «ошибка» становится «функцией», потому что никто не исправляет ее. (Если я неправильно запоминаю историю, кто-то поправляет меня.)
Как минимум, в сообществе Rails усиливается движение за обеспечение целостности базы данных. Ознакомьтесь с этой записью в блоге за прошлый месяц. Она даже ссылается на некоторые плагины, которые помогают обеспечить поддержку обработки ошибок (и еще одну запись в блоге, которая ссылается на другие плагины). Сделайте еще несколько поисков в Google; Я видел другие плагины, которые добавляли поддержку миграций для создания внешних ключей.
Теперь, то, что является частью основной философии Rails, таково: не беспокойтесь о вещах, если вам это действительно не нужно. Для многих веб-приложений вполне возможно, что небольшой (возможно, крошечный) процент записей содержит недопустимые данные. Страницы, которые могут быть затронуты, могут быть просмотрены очень редко, или ошибка уже может быть исправлена. Или, может быть, дешевле (например, в виде наличных денег) решать проблемы вручную в течение следующих 6 месяцев по мере роста приложения, чем тратить ресурсы на планирование на все непредвиденные обстоятельства сейчас. По сути, если ваши варианты использования не делают все это важным, и это может быть вызвано только состоянием гонки, которое может произойти за 1/10000000 запросов ... ну, оно того стоит?
Так что я предсказываю, что по умолчанию будут появляться инструменты для лучшей обработки всей ситуации, и в конечном итоге они будут объединены в Rails 3. А пока, если ваше приложение действительно нуждается в этом, добавьте их. Это вызовет небольшую головную боль при тестировании, но ничего такого, с чем вы не сможете справиться с помощью издевательств и заглушек. И если вашему приложению это не нужно ... ну, у вас все хорошо. :)