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