Railsモデルにスコープを構築しようとしています。このスコープを呼び出すと、7つのブールフィールドにネストされたAND句とOR句のセットが表示されます。わかりやすくするために、列名を簡略化した例を次に示します。
SELECT * FROM mytable
WHERE (a AND b AND c) OR (a AND d AND e) OR (a AND f AND g);
列a
は3つの句すべてに存在することに注意してください。それを書く別の方法は次のようになります:
SELECT * FROM mytable
WHERE a AND ((b AND c) OR (d AND e) OR (f AND g));
アレルは2番目のフォームでは寛容ではないようです。私は次のスコープに本当に近づきました:
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')
)
)
近いですが、3番目のAND
グループは2番目のグループから分離されていませんAND
。3番目のグループの最後に偽or
の句を追加すると、Arelは3番目の句を適切にグループ化することがわかりました...しかし、それはハックのようです。
そこにレール/アレルの達人が何かアイデアがあるかどうか疑問に思います。ありがとう!