Ruby on rails 在Rails中不工作的布尔字段的比较

Ruby on rails 在Rails中不工作的布尔字段的比较,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 3.2,我有一个Post模型,带有Post布尔字段 我创建了一个新帖子,没有给Post分配任何内容 irb(main):012:0> Post.first.posted Post Load (9.0ms) SELECT "posts".* FROM "posts" LIMIT 1 => nil 现在,我想选择所有post不等于true的帖子 我试过这个,但不起作用: irb(main):016:0> Post.where("posted != ?", true) Post

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

我创建了一个新帖子,没有给
Post
分配任何内容

irb(main):012:0> Post.first.posted
  Post Load (9.0ms)  SELECT "posts".* FROM "posts" LIMIT 1
=> nil
现在,我想选择所有
post
不等于
true
的帖子

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

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

有什么想法吗?

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

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

pp Post.all

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

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


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

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

t.boolean :f, default: true, null: false

但是-irb(main):019:0>Post.where(“posted=?”,true)Post Load(2.5ms)选择“posts”。*从“posts”where(posted='t')=>[]您可以试试这个吗?:
Post.where(:posted=>true)
t.boolean :f, default: true, null: false