Sql 初学者Rails迁移&;ActiveRecord中的列选项

Sql 初学者Rails迁移&;ActiveRecord中的列选项,sql,ruby-on-rails,migration,database-migration,Sql,Ruby On Rails,Migration,Database Migration,关于创建ActiveRecord表中的:null选项的快速问题 假设我要创建一个带有列description的新表 def change create_table :products do |t| t.string :name t.text :description, null: false end end 如果我的模型中没有任何关于说明列的:存在验证,那么“nothing”就不能传递到说明列中吗?我不确定null:false可以做什么来阻止我传

关于创建ActiveRecord表中的
:null
选项的快速问题

假设我要创建一个带有列
description
的新表

def change
    create_table :products do |t|
        t.string :name
        t.text :description, null: false
    end
end

如果我的模型中没有任何关于
说明
列的
:存在
验证,那么“nothing”就不能传递到说明列中吗?我不确定
null:false
可以做什么来阻止我传递任何内容,因为我没有任何验证

Rails迁移或模式选项,如
null:false
在数据库级别(存储)上操作。如果您试图用空的描述字段保存记录,您将收到一个数据库错误(例如,由PostgreSQL生成),该错误以
ActiveRecord::StatementInvalid:
形式包装。调用
object.valid?
时,从应用程序的角度(Rails)来看,该对象是有效的


Rails验证,如:存在,在应用程序级别运行。在这种情况下,传递null值将创建一个对象,该对象在
valid?
上返回false,您可以通过调用
object.errors来轻松访问该对象的错误消息。
如果不绕过验证,Rails不允许您将此类记录保存到数据库。

如果您不需要对描述进行任何状态验证,请从迁移中删除null:false。null false将强制要求描述中必须有某些内容
:null=>false
告诉数据库不要接受null值。继续,尝试创建一个带有空描述的产品,并告诉我它是保存到DB还是不保存谢谢,有没有一种情况下这样做比验证更有益?因为验证似乎是一个更好的解决方案。其中一种情况可能是您希望强制执行一些验证(这样您就不会让数据库变得混乱),因为正如我前面提到的,您实际上可以在保存之前跳过Rails中记录的验证。