2013-08-31 5 views
6

Sto lavorando a un progetto che utilizza ActiveAdmin per il suo backend di amministrazione.ActiveAdmin carica automaticamente la tabella di associazione completa

Ho due modelli, un modello di libro che ha_molti prodotti. Quando provo ad accedere alla vista indice dei prodotti in ActiveAdmin, sembra provare a caricare la tabella completa dei libri in memoria (ci sono circa 1,5 milioni di libri nel mio database). L'utilizzo della CPU arriva al 100% e l'utilizzo della memoria raggiunge i gigabyte.

l'attivazione di registrazione mysql conferma che questo è ciò che accade quando questo punto di vista si chiama:

17 Query  SELECT `books`.* FROM `books` 

Per quanto posso dire questo accade prima di ogni tentativo di caricare i prodotti.

di capire questo problema ho messo a nudo i modelli fino alla loro ossa nude:

class Product < ActiveRecord::Base 
    belongs_to :book 
end 

class Book < ActiveRecord::Base 
    has_many :products 
end 

Ho anche ridotto la definizione AA alla sua forma più elementare:

ActiveAdmin.register Product do 
end 

È questo normale per ActiveAdmin ? Non sembra un comportamento desiderabile.

risposta

26

Per chiunque si occupi di questo stesso problema, l'ho infine tracciato alla barra laterale generata automaticamente in ActiveAdmin. Questo include un campo di ricerca che include una casella di selezione per tutti i record associati.

Se si dispone di una tabella associata con oltre un milione di record, come faccio io AA tenterò felicemente di inserire l'intera tabella nella casella di selezione.

La risposta è stata di includere alcuni filtri personalizzati nella definizione AA per i prodotti in questo modo: (. A meno che non si specifica da soli)

ActiveAdmin.register Product do 
    filter :title 
end 

In questo modo non sarà incluso l'associazione

+1

appena avuto lo stesso problema, 10s di migliaia di record estratti per uno stupido elenco a discesa -_- Un po 'fastidioso di dover reinserire manualmente il resto dei filtri, apparentemente è tutto personalizzato o non personalizzato, ma qualunque sia - batte battendo backend! –