2011-09-23 6 views
10

私はシンプルなモデルRails内のARELでサブクエリの結合を行う方法

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 

しかし、Arel explicitly suggestsの作者Arelはこの種のことを行うことができます。

Raw SQLと同じクエリ、Arelクエリの別のタイプなどをどのように達成できるかについての回答は書かないでください。このクエリの特定の結果ではなく、私が興味を持っているパターンです。

答えて

8

あなたはARELを取得するためにjoin_sourcesを使用することができます::ノード:: ARELのインスタンスから参加:: 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と同じにするべきですか? –