Поддержка ограничения внешнего ключа в Rails

Как в Ruby on Rails добавить ограничение внешнего ключа при миграции?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
9
0
8 407
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

AFAIK, для этого нет встроенной поддержки, но есть несколько плагинов, которые помогут вам в этом. Вы также можете добавить их вручную в свои файлы миграции, просто используйте для этого метод execute, например (образец из Rails API):

  class MakeJoinUnique < ActiveRecord::Migration
    def self.up
      execute "ALTER TABLE `pages_linked_pages` ADD UNIQUE `page_id_linked_page_id` (`page_id`,`linked_page_id`)"
    end

    def self.down
      execute "ALTER TABLE `pages_linked_pages` DROP INDEX `page_id_linked_page_id`"
    end
  end

Старый пост, но на случай, если кто-то это увидит: уникальный индекс не эквивалентен ограничению внешнего ключа, поэтому я считаю, что этот код не отвечает на вопрос OP.

dsetton 21.06.2011 00:26

Вот решение на основе гемов, которое включает поддержку добавления и удаления ограничений внешнего ключа, не дает сбоев при использовании sqlite и правильно работает с файлами schema.rb:

http://github.com/matthuhiggins/foreigner

К вашему сведению, foreigner не генерирует внешние ключи в schema.rb при использовании SQLite, потому что SQLite не поддерживает внешние ключи.

ashes999 07.02.2015 02:08

Это обновление жемчужины matthuhiggins-foreigner: http://github.com/sparkfly/foreigner

Функции:

  • покрытие rspec, протестировано на PostgreSQL 8.3.9 и MySQL 5.0.90
  • Миграционная поддержка
  • поддержка schema.rb

В будущих версиях будут включены ограничения CHECK для PostgreSQL, которые необходимы для реализации наследования нескольких таблиц.

Спасибо. гем иностранца плохо работает с методом изменения, особенно если таблица не была создана раньше. Это отлично работает

Sean 08.02.2012 06:06

Ваше приветствие. Сообщите мне (через github), если обнаружите какие-либо ошибки.

Ho-Sheng Hsiao 08.02.2012 19:38

Достаточно ли будет добавить следующее, например, с моделями Products и User?

add_index :products, :user_id

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

Drew Dara-Abrams 04.08.2012 03:25

Другие вопросы по теме