了解rails migration语句(:null => false)

Flu*_*ine 5 migration ruby-on-rails-3

我试图理解以下语句,它来自rails迁移文件:

x.datetime "new",     :null => false
x.datetime "update",  :null => false
Run Code Online (Sandbox Code Playgroud)

我理解两个语句的第一部分(逗号之前的所有内容)但我不确定null部分

:null => false
Run Code Online (Sandbox Code Playgroud)

这基本上是在说"如果它不存在,那么它是假的吗?" 这个逻辑似乎有点奇怪,对此的任何澄清都会非常有帮助.

Pet*_*oom 22

:null => false在Rails迁移中告诉您的数据库不接受NULL值.:default => 0当查询中指定NULL或没有任何内容或(b)创建或更新对象时,它可以用来告诉数据库使用'0'作为默认值(a).(记住,'0'和NULL不是一回事.)


Dwa*_*oks 6

首先,我不会使用迁移中使用的x标准变量。t

现在,在迁移文件中,t对象create_table实际上是类型ActiveRecord::ConnectionAdapters::TableDefinition

和,

t.datetime "new",    :null => false
t.datetime "update", :null => false
Run Code Online (Sandbox Code Playgroud)

实际上翻译为

t.column("new", :datetime, { :null => false })
t.column("update", :datetime, { :null => false })
Run Code Online (Sandbox Code Playgroud)

其中最后一个参数是该方法的选项参数column

根据文档,这些选项之一是:null允许或不允许列中出现 NULL 值。

因此,总而言之,:null => false这意味着“在新列或更新列中不允许出现 NULL 值”。


Jon*_*ski 3

编辑:我认为这个问题是关于语法和翻译的,因为它最初提到了 CoffeeScript。出于目的,请参阅Peter Bloom 的回答


我不确定这:null => false到底是什么意思。

=>运算符是 Ruby 中的键/值分隔符,定义 aHash并将:null键设置为false。它类似于CoffeeScript/JavaScript 中的文字:-- 。Object{ null: false }

当在参数列表中使用时,它是 Ruby 中允许/模仿命名参数的一种选项。

另一个主要区别是 CoffeeScript/JavaScript 使用Strings 作为键,而 Ruby 通常使用符号—— "null"(cs/js) 与:null(rb)。

因此,CoffeeScript 中的语法等效项是:

x.datetime "new",     null: false
x.datetime "update",  null: false
Run Code Online (Sandbox Code Playgroud)

在 JavaScript 中,那就是:

x.datetime("new",    { null: false });
x.datetime("update", { null: false });
Run Code Online (Sandbox Code Playgroud)