2014-09-24 44 views
3

我有一個關於使用ANDOR合併幾個條件的問題,其中一個關於操作優先級。具有AND和OR的複雜Arel條件

所以,我需要生成以下SQL字符串傳遞給where方法:

where("NOT ((assignments.to IS NOT NULL AND assignments.to < :start_date) OR assignments.from > :end_date)", start_date: date.at_beginning_of_week, end_date: date.at_end_of_week) 

我阿雷爾重寫了它:

table = Assignment.arel_table 
where(
    table[:from].gt(date.at_end_of_week). 
    or(
    table[:to].not_eq(nil).and(table[:to].lt(date.at_end_of_week)) 
).not 
) 

但阿雷爾不把周圍條件括號與AND,結果這個條件選擇錯誤的數據。如何在這種情況下放置括號?

回答

5

您可以使用table.grouping方法將表達式用括號括起來,所以整個事情可以是這樣的

table = Assignment.arel_table 
where(
    table[:from].gt(date.at_end_of_week). 
    or(
    table.grouping(table[:to].not_eq(nil).and(table[:to].lt(date.at_end_of_week))) 
).not 
) 
-1

你可以嘗試:

table[:from].lt(end_date).and(
    table[:to].eq(nil).or(table[:to].gt(start_date)) 
) 

也許我錯過了什麼,但在任何情況下,你應該避免在Ruby中使用SQL NOTunless因爲它不是好的做法

+0

可以避免使用'not'在我的情況。但無論如何,我的問題不是關於「不」,而是關於分組。 – bronislav 2014-09-25 05:49:58