Rails 5.1:旧版 Rails 模式的外键不匹配。

4

背景:在Rails 5.1上,主键的默认值从Int更改为BigInt (PR > https://github.com/rails/rails/pull/26266)。

我正在开发一个新的Rails 5.1应用程序,它重用来自另一个Rails 4.0应用程序的一些模型。

当我运行specs时,我有一个脚本,基本上从其repo加载Rails 4.0应用程序的schema.rb文件,创建一个临时数据库,以便在运行测试时使用那些“外部”模型(来自其他DB)。

问题在于,由于其他应用程序在Rails 4.0上创建了schema.rb文件,所有Foreign Keys都是整数。

Rails 4.0 schema文件如下:

create_table "companies", force: :cascade do |t|
    t.string   "name"
end

create_table "users", force: :cascade do |t|
    t.string   "name",
    t.integer  "company_id", limit: 4, null: false
end

add_foreign_key "users", "companies"

因此,当我在新的Rails 5.1应用程序上运行测试时,它会加载其他应用程序模式(添加上述),但是在创建公司表时,它将主键设置为BigInt而不是integer。但是外键是一个integer
这种不匹配会影响MySQL:

ActiveRecord :: MismatchedForeignKey:表users上的列company_id类型为int(11)。这与companies上的列id类型bigint(20)不匹配。要解决此问题,请更改users上的company_id列的类型为:integer。(例如t.integer company_id)。

我知道我可以将该模式中的所有外键更改为BigInt。但是我想尝试避免这种解决方案,因为有相当多的外键和多个数据库。
有什么想法解决这个问题吗?或者有任何想法吗?
2个回答

0

您可以将type指定为integer,例如:

t.references :company, type: :integer, foreign_key: true, null: false

0

您可以为新表指定整数类型的主键;请参见this answer。这将使您有机会迁移到bigint主键,而不必被迫这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接