1

AREL に変換しようとしている SQL クエリがあります。それは始まります:

SELECT COUNT(id) > 0 AS exists...

これまでのところ、私は持っています:

Arel::Table.new(:products)[:id].count.gt(0).as(:exists)

しかし、私は得る:

NoMethodError - undefined method `as' for #<Arel::Nodes::GreaterThan:0x007fc98c4c58d0>

何か案は?

4

3 に答える 3

1

これはそれを行う必要があり、またはのいずれかが得られ0ます1

Arel::Table.new(:products)[:id].count.as('exists').gt(0)

テスト:

> Arel::Table.new(:products)[:id].count.as('exists').gt(0).to_sql
=> "COUNT([products].[id]) AS exists > 0"
于 2013-08-16T19:34:45.747 に答える
0

これが可能かどうかはわかりません。 gteqなどは、クエリの WHERE 部分で使用される式です。ここでやろうとしているのは、Arel のprojectメソッドによって処理される SELECT の一部であるフィールドのリストを操作することです。これは有効です:

Arel::Table.new(:products).project(product[:id].count.as(:exists))

ただし、条件を追加すると機能しませんgt(0)

これは空想的ではありませんが、必要なことを行います:

Arel::Table.new(:products).project(Arel.sql('COUNT(id) > 0').as('exists'))
于 2013-08-19T22:13:21.780 に答える
0

注: 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 ブール値に実際にマッピングする方法については、読者の演習として残しておきます。

于 2013-11-15T11:12:01.990 に答える