我的迁移文件如下:
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不能为null错误!
如何允许外键为空值?
答案 0 :(得分:1)
迁移不是当前db结构的声明,它们是合并后产生的更改。对于组合式结构导轨,请使用db/schema.rb
(对于更复杂的方案,请使用schema.sql
如果该列为null: false
,则必须在以后的迁移中对其进行更改(或者直接在db中进行更改,如果是这样-开发和生产之间的db结构可能不同步)。如果您想再次将其设置为null: true
,请添加另一个可更改此设置的迁移。但是首先,我想出了为什么它最终会处于当前状态,也许是有原因的。
change_column :carts, :user_id, :bigint, null:true