2011-09-23 16 views
10

Ho un semplice modelloCome fare unisce il subquery in AREL all'interno Rails

class User 
    has_many :logs 


class Logs 

correlate nel solito modo attraverso il logs.user_id chiave esterna. Sto cercando di fare quanto segue usando Arel e secondo il documento Arel dovrebbe funzionare.

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

Quando faccio che ottengo l'errore

TypeError: Cannot visit Arel::SelectManager 

Tuttavia l'autore di Arel explicitly suggests che Arel può fare questo genere di cose.

Si prega di non scrivere risposte su come posso ottenere la stessa query con sql raw, un altro tipo di query Arel ecc. È il modello a cui sono interessato non i risultati specifici di questa query.

risposta

8

È possibile utilizzare join_sources per recuperare i Arel :: :: Entra nodi dall'istanza di Arel :: SelectManager, e passare che a unisce

Usando il tuo esempio:

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

'l_t [: id] .eq (counts [: user_id]) 'funziona? Voglio dire, perché l'ID di un log dovrebbe essere uguale all'ID dell'utente? –