Techioz Blog

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)