2011-09-23 57 views
10

我有一個簡單的模型如何做好加入在AREL子查詢中使用Rails的

class User 
    has_many :logs 


class Logs 

通過外鍵logs.user_id以通常的方式有關。我正在嘗試使用Arel來執行以下操作,並根據Arel文檔進行操作。

u_t = Arel::Table::new :users 
l_t = Arel::Table::new :logs 

counts = l_t. 
    group(l_t[:user_id]). 
    project(
     l_t[:user_id].as("user_id"), 
     l_t[:user_id].count.as("count_all") 
    ) 

l_t.joins(counts).on(l_t[:id].eq(counts[:user_id])) 

當我這樣做,我得到的錯誤

TypeError: Cannot visit Arel::SelectManager 

然而阿雷爾explicitly suggests的筆者,阿雷爾可以做這種事情。

請不要寫關於如何使用原始sql,另一種類型的Arel查詢等來實現相同查詢的回覆。這是我感興趣的模式,而不是此查詢的具體結果。

回答

8

您可以使用join_sources檢索阿雷爾::節點::從阿雷爾:: SelectManager的實例加入,並傳遞到聯接

使用你的例子:

l_t.joins(counts.join_sources).on(l_t[:id].eq(counts[:user_id])) 
+1

'l_t [: id] .eq(counts [:user_id])'這是否工作?我的意思是,爲什麼日誌的id等於用戶的id? –