2014-09-24 2 views
3

У меня возник вопрос о составлении нескольких условий с AND и OR в отношении приоритетов операций.Сложные условия Arel с AND и OR

Итак, мне нужно сгенерировать следующий 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) 

я переписал его с Arel:

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)) 
) 

может быть, я что-то пропустил, но в любом случае следует избегать использования NOT в SQL или unless в рубин, потому что это не хорошая практика

+0

Может быть, можно избежать использования 'not', но не в моем случае. Но в любом случае мой вопрос был не о 'не', а о группировке. – bronislav

Смежные вопросы