Как миграции на Rails обеспечивают отношения? - PullRequest
3 голосов
/ 08 февраля 2009

При запуске:

rake db:migrate

обрабатываются только те файлы, которые находятся в db / migrate / right?

Хорошо, поскольку такие отношения, как один-к-одному, один-ко-многим и многие-ко-многим, определены в приложении / models /, как Rails обеспечивает выполнение таких отношений? После того как я выполню миграцию и посмотрю на сгенерированную схему базы данных, я не вижу никаких ограничений внешнего ключа. Поэтому меня смущает, как все это работает.

Ответы [ 3 ]

6 голосов
/ 08 февраля 2009

Проще говоря, нет.

Это связано с необходимостью поддержки нескольких баз данных. Некоторые, такие как sqlite, не поддерживают внешние ключи.

Чтобы добавить внешние ключи, вы должны выполнить для них необработанный SQL.

2 голосов
/ 08 февраля 2009

Как уже говорили другие, Rails на самом деле вообще не использует отношения SQL, а имитирует их только в коде. На самом деле он не обеспечивает ссылочную целостность, а создает впечатление, что это так.

Существует небольшая школа мысли, что вы должны не использовать миграцию по этой самой причине, но создавать и защищать свою базу данных с использованием необработанного DDL, поскольку философия Rails ошибочна в том, что она все еще оставляет ваши данные модель широко открыта при обеспечении некоторых мер безопасности (открытый способ, защищенный лазерами, - это то, как я хотел бы выразить это). Очевидно, вы теряете преимущества миграции (я полагаю, вы могли бы сохранить миграции и вручную добавить операторы выполнения). Смотрите книгу Enterprise Rails Дэна Чака; у него есть несколько глав, которые обсуждают это и демонстрируют его идеи.

1 голос
/ 08 февраля 2009

Гарри прав, ограничения применяются самим приложением. Если вы действительно хотите установить внешние ключи, плагин foreign_key_migrations может вам пригодиться.

...