2011-09-23 11 views
10

Tengo un modelo simpleCómo hacer uniones en subconsultas en AREL dentro de los carriles

class User 
    has_many :logs 


class Logs 

relacionados de la forma habitual a través de la logs.user_id clave externa. Intento hacer lo siguiente con Arel y, de acuerdo con el documento de Arel, debería funcionar.

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])) 

Cuando lo hago me sale el error

TypeError: Cannot visit Arel::SelectManager 

Sin embargo, el autor de Arel explicitly suggests que Arel puede hacer este tipo de cosas.

No escribo respuestas sobre cómo puedo lograr la misma consulta con sql en bruto, otro tipo de consulta Arel, etc. Es el patrón que me interesa no los resultados específicos de esta consulta.

Respuesta

8

Puede utilizar join_sources para recuperar los nodos Arel :: :: Ingreso de la instancia de Arel :: SelectManager, y pasan a que se une

Usando su ejemplo:

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

'l_t [: id] .eq (counts [: user_id]) '¿funciona esto? Quiero decir, ¿por qué el ID de un registro debe ser igual al ID del usuario? –

Cuestiones relacionadas