【问题标题】:Rails 5 Migration Data Type IssueRails 5 迁移数据类型问题
【发布时间】:2017-11-29 15:41:31
【问题描述】:

我最初使用 PostgreSQL 开发我的 rails 5 应用程序。由于托管方面的一些问题,我在完成所有开发后不得不切换到 MariaDB。

我正在尝试进行更新,以从我的购物车中添加对管理员的引用。这是我的迁移:

class AddAdminRefToCart < ActiveRecord::Migration[5.1]
  def change
    add_reference :carts, :admin, foreign_key: true
  end
end

当我跑步时

rake db:migrate

我收到此错误:

== 20171129152942 AddAdminRefToCart: migrating ================================
-- add_reference(:carts, :admin, {:foreign_key=>true})
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Column `admin_id` on table `carts` has a type of `bigint(20)`.
This does not match column `id` on `admins`, which has type `int(11)`.
To resolve this issue, change the type of the `admin_id` column on `carts` to be :integer. (For example `t.integer admin_id`).

错误是有道理的,但我不确定解决问题的正确方法。有人可以就我应该如何编写迁移提供一些指导吗?提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby postgresql ruby-on-rails-5 mariadb


    【解决方案1】:

    您可以只指定所需的确切数据类型,而不是使用add_reference

    add_column :carts, :admin_id, :integer, limit: 4
    add_foreign_key :carts, :admins
    

    limit: 4 参数告诉数据库创建一个 4 字节字段,它对应于 INT,而不是 limit: 8(现在显然是默认值),它对应于 BIGINT。

    正如我在 cmets 中提到的,不使用 add_reference 不会产生任何问题,因为 add_reference 只是 add_column 以及可选的 add_indexadd_foreign_key 的“语法糖”。

    【讨论】:

    • 这是否会导致 Rails 出现任何问题?由于未在关系中使用 add_reference,预期的 Rails 功能会停止工作吗?
    • 一点也不。 add_reference 只是 add_column 和可选的 add_indexadd_foreign_key 的语法糖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多