2

Rails 是否有一个与 Django NullBoolean 等效的内置函数,接受三个值(nil、true、false)?如果没有,你会如何建议实施它?

就我而言,我有一张桌子Overrides和一张桌子ObjectsObjects可以有很多OverridesOverrides在结构上与 几乎相同Objects。在读取 a 的值之前Object,我拉它Overrides,有条件地挑选它们,然后将这些值应用到Object.

任何Override为 nil 的字段都不会应用任何更改。这个系统对我来说运行良好,但我只是在 中添加了一个布尔字段Objects,所以我需要在 上放置一个可为空的布尔值Overrides。DjangoNullBoolean在这种类型的场景中运行良好,但我很难找到等效的 rails。

4

2 回答 2

5

ActiveRecord 将数据库中的可空性和类型分开。:null => false此外,除非您在创建/更改列时明确指定,否则 ActiveRecord 会将列创建为可为空的。所以你应该能够创建一个标准的布尔列:

create_table "..." do |t|
  #...
  t.boolean "boolean_column"
end

然后根据需要分配 true/false/nil:

o.boolean_column = true  # true
o.boolean_column = false # false
o.boolean_column = nil   # null
于 2012-10-15T19:57:34.973 回答
-2

在 Ruby 中,我们得到了nil.

对于条件语句,nil被解释为false.

1.8.7 :001 > if nil
1.8.7 :002?>   0
1.8.7 :003?>   end
 => nil 
1.8.7 :004 > if false
1.8.7 :005?>   0
1.8.7 :006?>   end
 => nil 
1.8.7 :007 > if true
1.8.7 :008?>   0
1.8.7 :009?>   end
 => 0 
1.8.7 :010 > x = 0
 => 0 
1.8.7 :011 > if nil
1.8.7 :012?>   x = 1
1.8.7 :013?>   end
 => nil 
1.8.7 :014 > x
 => 0 
1.8.7 :015 > if false
1.8.7 :016?>   x = 1
1.8.7 :017?>   end
 => nil 
1.8.7 :018 > if true
1.8.7 :019?>   x = 1
1.8.7 :020?>   end
 => 1 
1.8.7 :021 > x
 => 1 
1.8.7 :022 > if 2 
1.8.7 :023?>   x= 2
1.8.7 :024?>   end
 => 2 
1.8.7 :025 > x
 => 2 

有趣的是,如果您nil在 Ruby 中执行 non-value,它会被解释为true您在最后一种情况中看到的那样。

于 2012-10-15T19:39:32.313 回答