2011-03-02 95 views
1

可以說我有幾桌生成一個子查詢與阿雷爾獲得平均的平均

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;" 

有人知道嗎?

回答

1

我看到你的問題了上Forrst - 有一對夫婦的答案在這裏,但他們看起來像解決方法:

Nested queries in Arel

Building a subquery with ARel in Rails3

這不是ORM的關鍵失敗?對於任何超過基本SQL調用的任何事情 - 要麼數據庫受到攻擊來安撫ORM,要麼相反,我們必須將SQL轉換爲AQL,BQL,CQL(此處插入專有的ORM流體接口)。

+0

原則上這不是ORM的失敗。這是某些ORM實現的失敗。 – 2013-07-25 18:59:14

2

您可以非常接近,但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可以將服務器作爲適當的工具。