2012-05-24 1 views
4

Скажем, у меня есть набор условий:Использование NOT с Squeel

Person.where{(name =~ 'Ernie%') & (salary < 50000) | (name =~ 'Joe%') & (salary > 100000)} 

... который будет генерировать SQL следующим образом:

SELECT "people".* FROM people 
    WHERE ("people"."name" LIKE 'Ernie%' AND "people"."salary" < 50000) 
    OR ("people"."name" LIKE 'Joe%' AND "people"."salary" > 100000) 

Как я могу идти о переворачивая возвращаемый набор, т.е. обновление Squeel вернуть следующий SQL:

SELECT "people".* FROM people 
    WHERE NOT(("people"."name" LIKE 'Ernie%' AND "people"."salary" < 50000) 
    OR ("people"."name" LIKE 'Joe%' AND "people"."salary" > 100000)) 

Это немного надуманный, так как мой вопрос также включает в себя динамически роды я не могу изменить фактические условия, но вам просто нужно их обернуть в NOT().

Какие-либо идеи или предложения о том, где искать?

ответ

8

Вы хотите использовать унарный оператор минус.

Person.where{-((name =~ 'Ernie%') & (salary < 50000) | (name =~ 'Joe%') & (salary > 100000))}.to_sql 
=> "SELECT \"people\".* FROM \"people\" WHERE (NOT (((\"people\".\"name\" LIKE 'Ernie%' AND \"people\".\"salary\" < 50000) OR (\"people\".\"name\" LIKE 'Joe%' AND \"people\".\"salary\" > 100000))))" 
+2

Благодарим за это! Он пытался понять это. Это действительно документировано где-либо на странице Sicel github, или это недокументированная функция? – brad

+0

Дает ошибку: 'NoMethodError: undefined method' - @ 'для false: FalseClass' – josal