【问题标题】:rails 6 foreign key can't be nullrails 6外键不能为空
【发布时间】:2019-05-28 17:48:48
【问题描述】:

我有一个迁移文件如下:

def change
    create_table :carts do |t|
      t.string :order_number
      t.decimal :total_price
      t.bigint :user_id, null: true
      t.string :status

      t.timestamps
    end
  end

我想让user_id 为空,但我的架构文件将此迁移转换为:

t.bigint "user_id", null: false

所以在我的 cart.rb 模型中,即使我有

belongs_to :user, optional: true

它不起作用,当我尝试保存购物车对象时,我得到 ForeignKey can't be null 错误!

如何允许外键为空值?

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-6


    【解决方案1】:

    迁移不是当前数据库结构的声明,它们是组合时的更改 - 产生它。对于组合结构导轨有db/schema.rb(或schema.sql 用于更复杂的场景)

    如果该列是null: false,那么它一定已经被一些后来的迁移改变了(或者直接在db中,如果是这样的话——db结构可能在开发和生产之间不同步)。如果您希望它再次成为 null: true - 添加另一个迁移来改变它。但首先我会弄清楚为什么它会以当前状态结束,可能是有原因的。

    change_column :carts, :user_id, :bigint, null:true
    

    【讨论】:

    • 附加说明:如果迁移在您当前的功能/主题分支中,您可以在本地运行rails db:rollback 将其还原,然后使用null: true 选项再次运行它
    • 我只有一个迁移文件,其中 user_id 已添加到购物车中,因此没有其他迁移正在更改它,但是不知何故发生了一些奇怪的事情......因为我做了几次“rails db:reset”在此之前,当我运行rails db:migrate 时,它没有显示正在发生的事情的顺序(又名--verbose),所以我尝试了rails db:drop 然后rails db:create 然后rails db:migrate 这就是为我解决问题的原因!现在,当我运行 db:migrate 时,我也可以看到迁移正在详细运行
    • 我接受了您的回答,因为您推动我找出问题所在,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2018-01-06
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2015-02-28
    相关资源
    最近更新 更多