具有AND和OR的复杂Arel条件

bro*_*lav 3 ruby-on-rails arel

我有一个关于用操作优先级ANDOR一个组成几个条件的问题.

所以,我需要生成以下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)
Run Code Online (Sandbox Code Playgroud)

我用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
)
Run Code Online (Sandbox Code Playgroud)

但是Arel不会在条件周围放置括号AND,因此这个条件选择了错误的数据.如何在这种情况下放置括号?

Ahm*_*rif 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
)
Run Code Online (Sandbox Code Playgroud)