2011-07-05 47 views
4

我在我的表中的兩個子集進行聯盟與cnt是一個局部變量,使用AREL 2.0.9和squeel 0.8.5爲查詢界面。類型錯誤:無法訪問阿雷爾::節點::聯盟

def bla cnt 
    Domain.group { some_id }.select { `*` }.select { count(`*`).as(`cnt`) }.having { `cnt` >= cnt } 
end 

建立兩個呼叫的工會現在時說cnt(1).union(cnt(1))我得到一個Arel::Nodes::Union實例。

如何使用此關係來真正獲得我的結果?撥打#each會得到與TypeError: Cannot visit Arel::Nodes::Union相同的Arel::Nodes::Union參考值和#to_sql結果。

任何想法? I 可能會以不同方式填寫查詢,例如通過使用條件邏輯(?可行的AREL)...

+1

這似乎是相同的問題:https://github.com/rails/rails/issues/939。目前還不清楚爲什麼它被關閉。 – yawn

回答

0

您需要將ActiveRecord::Relation對象轉換爲Arel::Nodes::SelectStatement,你可以很容易地做到這一點的方式Relation#ast

union = Arel::Nodes::Union.new(cnt(1).ast, cnt(1).ast) 
Domain.find_by_sql(union.to_sql) 
+0

「Arel :: Nodes :: Union」上沒有'to_sql'實例方法(從Rails 3.2.1開始)。 –

+0

@Dmytrii不,但它存在於超類「Arel :: Nodes :: Node」中。我已經驗證,這仍然適用於3.2.2 –

+0

我試圖調用它時收到「找不到方法」。你確定這對你有用嗎? –

2

不知道如果我瞭解你的權利,但要獲得兩個或兩個以上單獨的查詢的一個聯盟,你可以使用followng方法:

scope :union, lambda { |a, b| where{id.in(Model.where{attr1.eq a}) | id.in(Model.where{attr2.eq b}) } } 

這是一個有點難看,但我不知道任何其他方式...

+0

這對我很好,謝謝 –