Внешние ключи в Рельс 3 - PullRequest
11 голосов
/ 06 января 2011

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

Я нашел много дискуссий, посвященных этой проблеме, но все они кажутся старыми и, к сожалению, они указывают на различные решения.* Я должен представить, что есть де-факто стандартный способ выполнения ограничений внешнего ключа в Rails 3. Однако, что бы это ни было (если оно существует), кажется, задушено всеми прошлыми обсуждениями, потому что я не могу его найти.

К этому моменту разработчики Rails в основном находятся на одной странице с внешними ключами?Если это так, я хотел бы знать, как они обычно обрабатываются.

Ответы [ 3 ]

6 голосов
/ 06 января 2011

Именно по этой причине я (и люди, написавшие Enterprise Rails - http://oreilly.com/catalog/9780596515201), рекомендую вам писать все ваши миграции вверх и вниз на SQL.

Преимущества:

  • Возможность добавления внешних ключей при создании таблицы - без отдельной таблицы изменения
  • Позволяет использовать типы полей определенных баз данных - например, tsvectors
  • Позволяет добавлять различные типы индексов - например, Gin или Gist
  • Позволяет писать функции и / или триггеры
  • Вам не нужно помнить, какой тип DSL относится к какому типу поля SQL - например, : Номер

Есть недостатки:

  • Это не зависит от базы данных (кого это волнует, и как часто вы будете менять свою базу данных?)
  • Это не Ruby (но каждый хороший разработчик Rails должен знать SQL, верно?)

Но в целом я считаю, что преимущества перевешивают недостатки.

Быстрый пример:

  def self.up
    execute <<EOS

create table .... (
  ....
);

EOS
   end
1 голос
/ 06 января 2011

http://guides.rubyonrails.org/migrations.html#active-record-and-referential-integrity

"Хотя Active Record не предоставляет никаких инструментов для работы непосредственно с такими функциями, метод execute может использоваться для выполнения произвольного SQL. Существует также ряд плагинов, таких как foreign_key_migrations, которыедобавить поддержку внешнего ключа в Active Record. "

0 голосов
/ 19 октября 2011

Я обнаружил, что задаю тот же вопрос на днях, поэтому я провел некоторое исследование и сопоставил свои выводы в ответе на более старый, но похожий вопрос переполнения стека .Я надеюсь, что это полезно.

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

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