2

いくつかのテーブルがあるとしましょう

orders = Arel::Table.new :orders
stores = Arel::Table.new :stores
managers = Arel::Table.new :managers

そして、マネージャーは多くの店舗を持ち、店舗には多くの注文があります。

ある日、マネージャーが働いている注文の平均合計を照会したいと考えています。ああ、それを店ごとにグループ化したい。明確にするために、マネージャーが勤務する店舗ごとに、マネージャーの平均注文合計を取得したいと思います。

そして、マネージャーを検索したとしましょう:

manager = Manager.find(some_id)


totals = orders.where(orders[:store_id].in(manager.store_ids)).group(orders.store_id).project(orders[:total].average)

puts totals.to_sql

"SELECT AVG(`orders`.`total`) AS avg_id FROM `orders` WHERE `orders`.`store_id` IN (1, 2, 3) GROUP BY `orders`.`store_id`"

うん、それはうまくいきます。しかし、これらの平均の平均を求めるクエリを取得するにはどうすればよいでしょうか?

このクエリを取得するための Arel は何ですか?

"SELECT AVG(avg_id) FROM (SELECT AVG(`orders`.`total`) AS avg_id FROM `orders` WHERE `orders`.`store_id` IN (1, 2, 3) GROUP BY `orders`.`store_id`) as avg_id_alias;"

誰か知ってる?

4

2 に答える 2

3

かなり近づくことができますが、ActiveRecord は Arel 構造体の実行を直接サポートしていないため、最初にそれらを SQL に変換する必要があります。

これは、あなたがしていることに似たものの例です:

o = Orders.arel_table
o_avg = Orders.select(:avg[:store_id].as('avg_id')).
              where(:store_id => [1,2,3]).group(:store_id)

Orders.find_by_sql("select avg(avg_id) from (#{o_avg.to_sql})")

この妥協に満足してください。ActiveRecord は、一度に複数のモデルに関する集計データを収集するのにはあまり適していません。SQL を一緒にパッチすることを慎重に考えている場合は、Arel を適切なツールとして使用できます。

于 2011-03-18T16:37:43.833 に答える
0

Forrst であなたの質問を見ました。ここにはいくつかの回答がありますが、回避策のように見えます。

Arel のネストされたクエリ

Rails3 で ARel を使用してサブクエリを作成する

これは ORM の主要な失敗ではありませんか? 初歩的な SQL 呼び出しを超えるものについては、ORM を緩和するためにデータベースが危険にさらされるか、逆に SQL を AQL、BQL、CQL に変換する必要があります (独自の ORM 流体インターフェイスをここに挿入します)。

于 2011-03-08T12:00:07.330 に答える