2014-09-24 30 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