Ruby on rails 使用带挤压的NOT运算符?

Ruby on rails 使用带挤压的NOT运算符?,ruby-on-rails,ruby,squeel,Ruby On Rails,Ruby,Squeel,如何使用squel编写SQL查询 SELECT * FROM documents where (NOT document.deleted OR document.deleted IS NULL) 我试过: Document.where { (-deleted) | (deleted == nil) } 但是得到这个错误: NoMethodError: undefined method `|' for deleted.-@:Squeel::Nodes::KeyPath

如何使用squel编写SQL查询

    SELECT * FROM documents where (NOT document.deleted OR document.deleted IS NULL)
我试过:

    Document.where { (-deleted) | (deleted == nil) }
但是得到这个错误:

    NoMethodError: undefined method `|' for deleted.-@:Squeel::Nodes::KeyPath

NOT
将反转返回的集合,因此您必须定义要比较的内容

(-deleted) #there is nothing to reverse
根据您的评论,我认为您的意思是
删除不等于true
,因此:

Document.where { -(deleted == true) | (deleted == nil) }
然而,真的反面是假的,对吗?所以,你可以说:

Document.where { (deleted == false) | (deleted == nil) }

请务必注意,ActiveRecord将布尔值存储为数据库中的字符串标志。因此,在您提到的情况下,
document.deleted
等于
'f'
,这是一个真实的值。这就是为什么不能简单地使用
NOT
操作符的原因

也许您正在寻找的是:

Document.where { deleted.eq(false) | deleted.eq(nil) }

干杯

您所说的
不是文档。已删除
?这意味着已删除的不等于真的只是一个简单的建议:在迁移过程中,将布尔列默认为
false
。然后您可以避免所有恼人的
| foo.eq(nil)
子句。