bro*_*lav 3 ruby-on-rails 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)
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,因此这个条件选择了错误的数据.如何在这种情况下放置括号?
您可以使用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)
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |