0

我正在尝试使用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 作为测试数据库?

4

1 回答 1

0

仔细观察,我看到这显示了 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) 作为 id,而 schema.rb 有 int(11),因为迁移依赖于 Rails 的默认 id 大小。

为了解决这个问题,我更改了默认的主键列类型,并重新进行了迁移。

于 2012-08-08T15:38:10.013 回答