Сложные условия Арела С и и или


У меня есть вопрос о составлении нескольких условий с 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)

Я переписал его с Арелом:

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
)

Но Arel не ставит скобки вокруг условия с AND , и в результате это условие выбирает неправильные данные. Как я могу поставить скобки в этом состоянии?

2 3

2 ответа:

Вы можете использовать метод 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
)

Вы можете попробовать:

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

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