Rails Foreigner: ограничения внешнего ключа для "тестовой" БД с использованием MySQL
Я пытаюсь использовать Foreigner для включения ограничений внешнего ключа в Rails. Он работает на моей базе данных разработки, но я получаю следующую ошибку при попытке запустить свои тесты:
Errors running test:units! #<ActiveRecord::StatementInvalid: Mysql2::Error: Can't create table
'arizona_test.#sql-368_be' (errno: 150): ALTER TABLE `arizona_downloads` ADD CONSTRAINT
`arizona_downloads_ibfk_1` FOREIGN KEY (`books_id`) REFERENCES `books`(id) ON DELETE SET NULL>
Как ни странно, тесты работают нормально, и в конце я получаю эту ошибку.
Я подозреваю, что Foreigner пытается использовать синтаксис SQLite для тестовой БД, не подозревая, что я использую MySQL (и адаптер mysql2). Есть ли способ сказать иностранцу, что я использую MySQL для тестовой базы данных?
1 ответ
Присмотревшись повнимательнее, я вижу, что это показывает MySQL errno 150. И работает SHOW ENGINE INNODB STATUS
показал:
120808 11:24:29 Error in foreign key constraint of table arizona_test/#sql-368_6e:
FOREIGN KEY (`book_id`) REFERENCES `books`(id) ON DELETE SET NULL:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Это происходило потому, что моя среда разработки использовала bigint(20) для идентификаторов, тогда как schema.rb имеет int(11) из-за миграции, которая основывалась на размере идентификатора Rails по умолчанию.
Чтобы решить эту проблему, я изменил тип столбца первичного ключа по умолчанию и повторил миграцию.