由于外键类型,Rails 模型生成失败

Chr*_* K. 6 ruby-on-rails rails-migrations ruby-on-rails-6

我使用以下命令创建了一个模型:

rails g model UserCertification user:references certification:references certification_no:string
Run Code Online (Sandbox Code Playgroud)

这是参考我的设计用户模型user:references

在 db:migrate 我收到以下错误: 引起:

ActiveRecord::MismatchedForeignKey:user_iduser_certifications上的列idusers类型为 的列不匹配bigint(20)。要解决此问题,请将user_id列的类型更改 user_certifications为 :bigint。(例如 t.bigint :user_id)。原消息:Mysql2::Error:无法添加外键约束

这是我的迁移

class CreateUserCertifications < ActiveRecord::Migration[6.0]
  def change
    create_table :user_certifications do |t|
      t.references :user, null: false, foreign_key: true
      t.references :certification, null: false, foreign_key: true
      t.string :certification_no

      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我试图将类型设置为整数 t.references :user, null: false, foreign_key: true,type: :integer

我还删除了模型并重新编辑并检查了以前的参考资料,但没有成功。也许有人有想法?

Dav*_*mpy 10

尝试在引用中设置类型以匹配其他表:

t.references(:user, null: false, type: :bigint)
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请尝试在 user_certifications 中明确创建外键:

t.bigint :user_id, null: false
t.references(:user)
Run Code Online (Sandbox Code Playgroud)

  • `t.references` 创建列和外键约束。如果您想手动添加外键,您应该使用“add_foreign_key :from, :to”。[TableDefinition](https://api.rubyonrails.org/v5.1.7/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#method-i-references) 中没有等效项。 (3认同)
  • t.references(:user, null: false, type: :bigint) 适用于这两种情况。我不知道为什么这之前不起作用 - 发生了一些奇怪的事情。谢谢大卫! (2认同)
  • 我刚刚遇到了这个。有没有人弄清楚为什么会发生这种情况?如果两个迁移都是使用 Rails 6 生成的,那么您不必指定类型,因为 `:bigint` 已经是 `:id` 的默认类型,对吧?当然,如果我们指定类型,它可以解决问题,但我们不必这样做,对吗? (2认同)

Kal*_*san 5

如果您在 Rails 6(也可能是其他版本)中看到此消息,则该错误消息可能具有误导性,并且与数据类型完全无关。

例如,在您的示例中,如果该表certifications不存在(例如,因为拼写错误),您仍然会收到错误消息,声称 user_id 应该是 bigint,即使用户引用完全正常。

系统地注释掉一些引用并运行 db:migrate 和 db:rollback,直到确定实际失败的引用。然后再仔细检查是否正确。