在Rails中不起作用的布尔字段的比较

时间:2012-10-24 17:09:39

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我有一个Post模型,带有posted布尔字段。

我创建了一个新帖子,但未向posted分配任何内容。

irb(main):012:0> Post.first.posted
  Post Load (9.0ms)  SELECT "posts".* FROM "posts" LIMIT 1
=> nil

现在,我想选择posted不等于true的所有帖子。

我试过这个,但它不起作用:

irb(main):016:0> Post.where("posted != ?", true)
  Post Load (2.5ms)  SELECT "posts".* FROM "posts" WHERE (posted != 't')
=> []

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

这是因为数据库如何处理NULL。尝试在迁移中设置:default => false

根据您的数据库,您可能会看到如下内容:( MySQL中的示例)

SELECT 1 = NULL; # returns NULL
SELECT 1 != NULL; # returns NULL

答案 1 :(得分:0)

我怀疑您为帖子创建的表格posted的默认值为true而不是false。

您可以随时选择整个表格来查看Post的值。把它放在控制台中:

pp Post.all

答案 2 :(得分:0)

我可以建议您使用sqlite,因此这是文档告诉我们的:“存储类为NULL的值被认为小于任何其他值(包括存储类为NULL的另一个值)。”因此,您只能使用WHERE x IS NOT NULL表达式从数据库获取具有NULL值的记录。

您应该避免使用具有可能NULL值的布尔字段。一种方法是在迁移中将字段声明为非空:

t.boolean :f, default: true, null: false
相关问题