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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails4迁移 - 向add_reference方法添加null:false?相关的知识,希望对你有一定的参考价值。

我刚刚开始学习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阅读,但无法弄清楚我做错了什么。

答案

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

add_reference :posts, :category, index: true, foreign_key: true, null: false
change_column :posts, :category_id, :integer, null: false
另一答案

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

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

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

validates :category, presence: true

到你的Post模型。

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

另一答案

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

另一答案

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

以上是关于Rails4迁移 - 向add_reference方法添加null:false?的主要内容,如果未能解决你的问题,请参考以下文章

参考级联删除或删除时的选项

Ruby - 模型中表示的迁移参考

在 Rails 4 迁移中设置自定义主键的问题

AWS Beanstalk - 在 Rails 4.2.1 迁移后,Passenger Standalone 不提供网页服务

将 rails 应用程序从 3.2.3 迁移到 rails 4.0.0.rc2 后无法在 Heroku 上部署

Rails 和 Devise 的强大参数