2011-12-14 5 views
15

Mam stronę indeksu ActiveAdminzachłanne ładowanie związane modele zapytania sql ActiveAdmin

ActiveAdmin.register Bill 

I staram się wyświetlać linki do powiązanych modeli

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

Ale biegnę do N + 1 problem z zapytaniem - jest zapytanie o pobranie każdego użytkownika.

Czy istnieje sposób na szybkie ładowanie użytkowników rachunków?

Odpowiedz

26

Jest odpowiedź na inny post, ale dobrze opisuje to, co musisz tutaj zrobić.

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

Tutaj musisz się upewnić, że podążasz za zakresem. Jeśli więc twój kontroler ma zasięg scope, to będziesz chciał zastąpić powyższą nazwę modelu parametrem scope_to'ed.

+2

to nie jest podzielone na strony = wynik może być ogromny – okliv

1

WAŻNA UWAGA EDIT: co za tym idzie jest rzeczywiście fałszywy, patrz komentarze do wyjaśnienia. Jednak pozostawiam tę odpowiedź tam, gdzie ona stoi, ponieważ wydaje mi się, że nie jestem jedynym, który może być zagubiony przez przewodników, więc może ktoś inny uzna to za przydatne.

Zakładam, że

class Bill < ActiveRecord::Base 
    belongs_to :user 
end 

tak according to RoR guides jest już chętny załadowane:

Nie ma potrzeby stosowania: include natychmiastowych skojarzeń - czyli jeśli masz Order belongs_to: klienta, wtedy klient jest automatycznie ładowany - gdy jest potrzebny.

należy sprawdzić dziennik SQL, czy to prawda (nie wiedział, że ja, ja po prostu sprawdzenie czegoś o :include aby odebrać wam kiedy zobaczyłem to ... daj mi znać)

+0

myślę, że to bardzo wątpliwe, ale kto wie? –

+2

_the klient jest ładowany-ładowany automatycznie, gdy jest potrzebny_ - to znaczy, jeśli masz 1000 zamówień i iterujesz je, wywołujesz 'order1.customer', a' customer1' jest ładowany, ponieważ jest potrzebny. Wtedy uzyskujesz dostęp do 'order2.customer', ale hej, nie powiedziałeś, że będziesz go potrzebował, więc inne zapytanie do bazy danych jest gotowe. Ale wciąż nie wie, że będziesz potrzebować 'customer3' w następnej iteracji, więc otrzymasz 1000 zapytań zamiast 1. – RocketR

+0

dzięki za wyczyszczenie tego. W ten sposób odkrywam, że rzeczy są mylące, ale angielski nie jest moim ojczystym językiem. –

10

Sposobem na to jest przesłonięcie metody scoped_collection (zgodnie z odpowiedzią Jeffa Ancela), ale zadzwoń pod numer super, aby zachować istniejący zakres. W ten sposób zachowujesz istniejący zakres i wszelkie paginację/filtrowanie, które zostały zastosowane przez ActiveAdmin, zamiast zaczynać od zera.

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 

Jak zaznaczono w oficjalnej dokumentacji na http://activeadmin.info/docs/2-resource-customization.html

+3

To powinna być zaakceptowana odpowiedź – danielricecodes