2011-12-14 6 views
15

Ho una pagina di indice ActiveAdminEager modelli di carico associato a ActiveAdmin query SQL

ActiveAdmin.register Bill 

e sto cercando di visualizzare collegamenti a modelli associati

index do 
    column "User" do |bill| 
    link_to bill.user.name, admin_user_path(bill.user) 
    end 
end 

Ma mi imbatto in regola N + 1 problema di query - c'è una query per recuperare ogni utente.

Esiste un modo per caricare gli utenti delle fatture?

risposta

26

C'è una risposta su un altro post, ma descrive bene quello che devi fare qui.

controller do 
    def scoped_collection 
     Bill.includes(:user) 
    end 
    end 

Qui, è necessario assicurarsi di seguire l'ambito. Quindi se il tuo controller è scope_to'ed, allora dovrai sostituire il nome del modello sopra con il parametro scope_to'ed.

+2

non è impaginato = il risultato può essere enorme – okliv

1

IMPORTANTE EDIT NOTA: Quello che segue è in realtà falsa , vedere i commenti per una spiegazione. Comunque lascio questa risposta dove sta perché sembra che non sia l'unico ad essere confuso dalle guide, quindi forse qualcun altro lo troverà utile.

Suppongo che

class Bill < ActiveRecord::Base 
    belongs_to :user 
end 

così according to RoR guides è già ansioso-caricato:

Non c'è alcuna necessità di utilizzare: includere per le associazioni immediate - che è, se avete ordine belongs_to: cliente, quindi il cliente è caricato automaticamente quando è necessario.

è necessario controllare il registro di SQL se è vero (non sapevano che io, ero solo verificando qualcosa circa :include di rispondervi quando ho visto questo ... me lo faccia sapere)

+0

penso che sia molto dubbio, ma chi lo sa? –

+2

_il cliente viene caricato automaticamente quando è necessario_ - ciò significa che, se si hanno 1000 ordini e si itera su di essi, si chiama 'order1.customer', e' customer1' viene caricato perché è necessario. Quindi accedi a 'order2.customer', ma hey, non hai detto che ne avresti avuto bisogno, così è stata fatta un'altra query al database. Ma ancora non sa che avrai bisogno di 'customer3' nella tua prossima iterazione, quindi otterrai 1000 query invece di 1. – RocketR

+0

grazie per averlo risolto. Trovo questo modo di esporre le cose confuse, ma l'inglese non è la mia lingua madre. –

10

Il modo per fare ciò è ignorare il metodo scoped_collection (come indicato nella risposta di Jeff Ancel) ma chiamare super per mantenere l'ambito esistente. In questo modo si mantiene l'ambito esistente e qualsiasi impaginazione/filtro che è stato applicato da ActiveAdmin, piuttosto che partire da zero.

ActiveAdmin.register Bill do 
    controller do 
    def scoped_collection 
     super.includes :user 
    end 
    end 

    index do 
    column "User" do |bill| 
    link_to bill.user.name, admin_user_path(bill.user) 
    end 
    end 
end 

Come indicato nella documentazione ufficiale a http://activeadmin.info/docs/2-resource-customization.html

+3

Questa dovrebbe essere la risposta accettata – danielricecodes

Problemi correlati