Rails4迁移 - 向add_reference方法添加null:false?

问题描述 投票:4回答:4

我刚刚开始学习rails,如果对此的回答相当明显,那就很抱歉。

我在我的应用程序中添加了帖子和类别表的迁移,现在使用以下行添加对posts表中类别的引用,其默认值为not null:

add_reference :posts, :category, index: true, foreign_key: true, null: false

但是我在运行迁移时遇到以下错误:

SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "posts" ADD "category_id" integer NOT NULL

我试过通过api阅读,但无法弄清楚我做错了什么。

ruby-on-rails ruby ruby-on-rails-4 rails-migrations
4个回答
3
投票

也许sqlite3不允许这样做,试试

add_reference :posts, :category, index: true, foreign_key: true, null: false
change_column :posts, :category_id, :integer, null: false

0
投票

该消息基本上表示如果没有为其定义默认值,则无法创建“非空”列。

我认为你应该删除null: false选项。

要防止在POSTS表中显示NULL值,请添加

validates :category, presence: true

到你的Post模型。

另请参阅此文章https://robots.thoughtbot.com/referential-integrity-with-foreign-keys以更好地理解Rails中的外键。


0
投票

经过一些进一步阅读后,这似乎是sqlite3的一个错误。显然,在对现有表进行更改时,不能向上面的引用添加非null值(这可以在MYSQL中使用)。但是,从头开始创建表时,可以执行此操作。通过将上面的行添加到我的类别的create_table迁移中来管理以使其工作。


0
投票

注意:使用引用时,there is no need to specify index: true

© www.soinside.com 2019 - 2024. All rights reserved.