2012-05-24 71 views
4

不用說我有一組條件:與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

謝謝!正在努力解決這個問題。這實際上是否記錄在Squeel github頁面上的任何地方,還是這是一個未記錄的功能? – brad

+0

給出錯誤:'NoMethodError:未定義的方法' - @'false:FalseClass' – josal