AREL での and と ors のグループ化
概要
arel を使用して、この SQL スニペットと同等のクエリを実行しようとしています。
WHERE (("participants"."accepted" = 'f' AND "participants"."contact_id" = 1)
OR "participants"."id" IS NULL)
だから私は(受け入れられた&& contact_id=1) OR NULLが欲しいです
AREL で得られるものは次のとおりです
participants[:accepted].eq(false).and(participants[:contact_id].eq(1).
or(participants[:id].is(nil)
問題は、これにより次のものが生成されることです。
("participants"."accepted" = 'f' AND "participants"."contact_id" = 1 OR "participants"."id" IS NULL)
my と条件の周囲に括弧がないことに注意してください。演算子の優先順位に従って、次の結果が得られると思います。
accepted && (contact_id=1 OR NULL)
AREL クエリに括弧を追加しても影響はありません。何かご意見は?
解決策
Arel::Nodes::Grouping を使用してかっこを生成できます。
participants = Arel::Table.new("participants")
arel = participants.grouping(
participants[:accepted].eq(false).and(participants[:contact_id].eq(1))
).or(participants[:id].eq(nil))
arel.to_sql # => (("participants"."accepted" = 'f' AND "participants"."contact_id" = 1) OR "participants"."id" IS NULL)