2012-07-24 4 views
5

ho un rapporto padre/figlio nella mia applicazioneRails attivo Record Select padre e figlio come uno risultato

class Polling 
has_many :alerts, :dependent => :destroy 

class Alert 
belongs_to :polling 

Sulla mia pagina di indice per le segnalazioni, ho bisogno di mostrare alcuni dati da ciascun genitore, e questo risultino due interrogazioni

Alert Load (6.1ms) SELECT * FROM (SELECT * FROM "ALERTS" INNER JOIN "POLLINGS" ON "POLLINGS"."ID" = "ALERTS"."POLLING_ID" ORDER BY "ALERTS"."ID" DESC) WHERE ROWNUM <= 1 
Polling Load (1.8ms) SELECT "POLLINGS".* FROM "POLLINGS" WHERE "POLLINGS"."ID" = 10113 AND ROWNUM <= 1 

Ovviamente, questo rende il tempo di caricamento pagina abbastanza assurdo quanto ha un ciclo tra ciascuno e tirare l'oggetto principale pure.

ho provato un paio di cose, come

> Alert.joins(:polling).where(...) 
> Alert.includes(:polling).where(...) 
> Alert.joins(:polling).select('*').where(...) 

E ogni volta ho ottenere due domande distinte quando ho visitare la mia pagina di indice. Uno per ciascun avviso e poi un altro per ottenere i dati principali. Come posso farlo su una riga in modo tale che quando richiamo gli avvisi ricevo anche i relativi dati relativi ai genitori? Non sembra esserci un modo per farlo dall'altra parte perché se faccio un Pollings.where(...) non cattura i bambini come gruppo.

+1

Sei decisamente sulla strada giusta con il metodo include. L'altro angolo sarebbe provare Polling.includes (: alerts) .where (...). Puoi pubblicare il tuo codice di visualizzazione? – steakchaser

+0

Il fatto è che dobbiamo affrontarlo dal lato bambino, non dal lato genitore. – Oranges13

+0

Non vuoi il precarico? http://apidock.com/rails/ActiveRecord/AssociationPreload/ClassMethods/preload_associations – toxaq

risposta

2

Se si desidera specificare SQL in dettaglio, si può sempre provare find metodo di passaggio: includere,: unisce,: dove ecc includes o joins fa stessa cosa su tutta la linea quando si tenta di accedere ai dati, ma il comportamento di ActiveRecord è diverso. Ad esempio, seguendo 3 modi, si imposta l'array di oggetti ma sono diversi.

[1]

alerts = Alert.joins(:polling) 

[2]

alerts = Alert.includes(:polling) 

[3]

alerts = Alert.find(:all, :includes => :polling, :joins => :polling) 

quando fate

alerts.each do |alert| 
    alert.pollings.each do |polling| 
    p polling 
    end 
end 

puoi vedere come activerecord cerca di ottenere dati dal DB o dalla cache. Il metodo [3], credo, genera una sola query quando gli altri generano più query.

+0

Ho scoperto che anche se faccio Alert.find con un join, se uso alert.pollings ne rimuove quelli indietro separatamente dal database , quindi questo è ciò che stava causando a fare ancora le domande aggiuntive. Ho finito per usare anche un .select() e facendo semplicemente alert.polling_field funziona come previsto. Strano, ma funziona. – Oranges13