Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails4迁移-向添加引用方法添加null:false?_Ruby On Rails_Ruby_Ruby On Rails 4_Rails Migrations - Fatal编程技术网

Ruby on rails Rails4迁移-向添加引用方法添加null:false?

Ruby on rails Rails4迁移-向添加引用方法添加null:false?,ruby-on-rails,ruby,ruby-on-rails-4,rails-migrations,Ruby On Rails,Ruby,Ruby On Rails 4,Rails Migrations,我刚刚开始学习rails,很抱歉,如果这个问题的答案相当明显的话 我已经在我的应用程序中添加了帖子和类别表的迁移,现在使用以下行添加对我帖子表中类别的引用,默认值为NOTNULL: add_reference :posts, :category, index: true, foreign_key: true, null: false 但是,我在运行迁移时遇到以下错误: SQLite3::SQLException: Cannot add a NOT NULL column with defaul

我刚刚开始学习rails,很抱歉,如果这个问题的答案相当明显的话

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

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,但无法找出我做错了什么。

消息基本上说,如果不定义默认值,就无法创建“notnull”列

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

要防止POSTS表中出现空值,请添加

验证:类别、状态:true

到您的
Post
型号


另请参见也可以查看此帖子,以更好地了解Rails中的外键。

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


进一步阅读之后,这似乎是sqlite3的一个bug。显然,在对现有表进行更改时,不能向上面这样的引用添加NOTNULL值(这在MYSQL中有效)。但是,在从头开始创建表时可以执行此操作。通过将上面的一行添加到我的类别创建表迁移中,成功地实现了这一点。

注意:使用引用时,。

感谢您的回复,验证在我的模型上正常工作。我在一篇教程中读到,在数据库级别添加验证以及请求的最佳实践偶尔会通过模型验证,特别是在流量很大的情况下,这就是我一直在尝试上述方法的原因。是否有更好的方法将NOTNULL值添加到此列中,或者在这种情况下将验证留给模型就可以了?谢谢again@Lin457我在一篇博客文章中添加了一个链接,您可以在这里阅读有关保护外键的数据库部分的更多信息。@Lin457这不是sqlite3的错误。我不确定MySQL,但其他几个数据库也有相同的行为。我认为在可能的情况下,在数据库级别强制执行对表(和应用程序)至关重要的内容通常是一个好主意。sqlite是正确的,这就是它应该如何工作的。还有其他关系数据库也是这样,我不明白为什么sqlite在这种情况下是正确的。“必须有值”外键是一个正常的要求,它受到广泛的数据库引擎的支持。然而,我并没有像L457建议的那样在创建表的过程中找到添加引用的好方法。当使用引用时,(不需要指定
索引:true
)[.ActiveRecord(不严重依赖DB约束)[,但是如果有一个引用字段而没有对字段进行索引,这会有点疯狂,不是吗?
add_reference :posts, :category, index: true, foreign_key: true, null: false
change_column :posts, :category_id, :integer, null: false