我想在我的rails模型中構建一個範圍,當它被調用時,會給我一組嵌套的AND和OR子句7個布爾字段。下面是用簡單的列名的例子爲清楚:分組的AND和OR子句Arel
SELECT * FROM mytable
WHERE (a AND b AND c) OR (a AND d AND e) OR (a AND f AND g);
注意,列a
存在於所有的三個條款。編寫它的另一種方法是:
SELECT * FROM mytable
WHERE a AND ((b AND c) OR (d AND e) OR (f AND g));
Arel在第二種形式上似乎不那麼寬容。我已經得到非常接近與follwing範圍:
scope :needs_any_delivery, lambda {
table = self.arel_table
common_assert = table[:a].eq(true)
where(
common_assert.and(
table[:b].eq(true).and(
table[:c].eq(false)
)
).or(
common_assert.and(
table[:d].eq(true).and(
table[:e].eq(false)
)
).or(
common_assert.and(
table[:f].eq(true).and(
table[:g].eq(false)
)
)
)
)
)
}
這將產生以下查詢:
SELECT * FROM mytable
WHERE (
(a = 't' AND b = 't' AND c = 'f'
OR (a = 't' AND d = 't' AND e = 'f' OR a = 't' AND f = 't' AND g = 'f')
)
)
已經很接近了,但第三AND
組未從第二AND
組分開。我發現,如果我在第三組的末尾添加了一些額外僞造的or
子句,那麼Arel會自行將第三個子句合併......但這看起來像是一種破解。
想知道如果任何rails/arel大師有任何想法。謝謝!
有趣。在這種情況下,我不確定我會使用除Arel以外的其他任何內容,但感謝回覆和答覆! – localshred 2013-02-25 15:50:49