0

我有一个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')
=> []

有任何想法吗?

4

3 回答 3

2

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

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

SELECT 1 = NULL; # returns NULL
SELECT 1 != NULL; # returns NULL
于 2012-10-24T17:12:31.357 回答
0

我怀疑您为 Post 创建的表的默认值为postedtrue 而不是 false。

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

pp Post.all
于 2012-10-24T17:11:47.307 回答
0

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

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

t.boolean :f, default: true, null: false
于 2012-10-24T17:46:26.107 回答