注: Arel は、すべての実用的な目的のために、完全に文書化されていないため、これの多くは推測です! これを行うためのより良い、またはより速い方法があるかもしれませんが、見た目からすると、以下のものが正しいはずです。
Arel のこれらの部分は、SelectManager またはそれらを処理できる他のエンティティに渡す必要がある AST ノードのみを生成することに注意してください。
構文要素を作成するには、次のようにします。
node = Arel::Nodes::As.new(
Arel::Table.new(:products)[:id].count.gt(0),
'exists'
)
"COUNT(`products`.`id`) > 0 AS 'exists'"
これにより、SelectManager の に渡すことができるSQL フラグメントが生成されます#project
。次のようなちょっとしたトリックを行うことができます。
Products
.where(nil) # shortcut to get a relation
.tap do |rel|
node = () # from above
# Go into the SelectManager and *add* a projection.
# If you want to *replace* the entire projection, first do:
# rel.arel.projections = []
rel.arel.project(node)
end
データベースのバックエンドに応じて、述語の結果を適切な Ruby ブール値に実際にマッピングする方法については、読者の演習として残しておきます。