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






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
Вот решение на основе гемов, которое включает поддержку добавления и удаления ограничений внешнего ключа, не дает сбоев при использовании sqlite и правильно работает с файлами schema.rb:
http://github.com/matthuhiggins/foreigner
К вашему сведению, foreigner не генерирует внешние ключи в schema.rb при использовании SQLite, потому что SQLite не поддерживает внешние ключи.
Это обновление жемчужины matthuhiggins-foreigner: http://github.com/sparkfly/foreigner
Функции:
В будущих версиях будут включены ограничения CHECK для PostgreSQL, которые необходимы для реализации наследования нескольких таблиц.
Спасибо. гем иностранца плохо работает с методом изменения, особенно если таблица не была создана раньше. Это отлично работает
Ваше приветствие. Сообщите мне (через github), если обнаружите какие-либо ошибки.
Достаточно ли будет добавить следующее, например, с моделями Products и User?
add_index :products, :user_id
Добавление индекса, безусловно, поможет повысить производительность запросов, но не заставит базу данных применять ограничения внешнего ключа.
Старый пост, но на случай, если кто-то это увидит: уникальный индекс не эквивалентен ограничению внешнего ключа, поэтому я считаю, что этот код не отвечает на вопрос OP.