我有一个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')
=> []
有什么想法吗?
答案 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