2013-02-18 2 views
3

Как написать SQL-запрос с помощью Squeel?Использование оператора NOT с Squeel?

SELECT * FROM documents where (NOT document.deleted OR document.deleted IS NULL) 

Я пробовал:

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

но получаю эту ошибку:

NoMethodError: undefined method `|' for [email protected]:Squeel::Nodes::KeyPath 
+0

, что вы имеете в виду 'НЕ document.deleted'? – gabrielhilal

+0

Thats mean deleted not equal true – mma

ответ

2

Это очень важно отметить, что ActiveRecord хранит логические значения в виде строки флагов в базе данных. Поэтому в указанном вами случае document.deleted соответствует 'f', который является правным значением. Вот почему вы не можете просто использовать оператора NOT.

Возможно, что вы ищете является:

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

Приветствиях

+0

Просто быстрый совет: в ваших миграциях сделайте ваши булевы столбцы по умолчанию «false». Тогда вы можете избежать всех раздражающих '| foo.eq (nil) '. –

2

NOT будет обратный возвращаемый набор, так что вы должны определить, что вы сравниваете.

(-deleted) #there is nothing to reverse 

Основываясь на ваш комментарий, я думаю, что вы имеете в виду deleted not equal true, так:

Document.where { -(deleted == true) | (deleted == nil) } 

Однако, обратная правда ложь, не так ли? Таким образом, вы можете сказать:

Document.where { (deleted == false) | (deleted == nil) } 
Смежные вопросы