Ruby on rails 使用带挤压的NOT运算符?
如何使用squel编写SQL查询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
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)
子句。