2011-12-14 11 views
15

que tengo una página de índice ActiveAdminmodelos de carga asociada Eager en ActiveAdmin consulta SQL

ActiveAdmin.register Bill 

y estoy tratando de mostrar enlaces a modelos asociados

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

Pero me encuentro con los N + 1 problema de consulta: hay una consulta para buscar a cada usuario.

¿Hay alguna forma de impaciente carga de los usuarios de las facturas?

Respuesta

26

Hay una respuesta en una publicación diferente, pero describe bien lo que necesita hacer aquí.

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

Aquí, debe asegurarse de seguir el osciloscopio. Entonces, si su controlador es scope_to'ed, querrá reemplazar el nombre del modelo anterior por el parámetro scope_to'ed.

+2

no es paginado = el resultado puede ser enorme – okliv

1

EDITAR NOTA IMPORTANTE: lo que sigue es en realidad falsa , ver los comentarios para una explicación. Sin embargo, dejo esta respuesta en pie, porque parece que no soy el único en confundirme con las guías, por lo que tal vez alguien más lo encuentre útil.

Asumo que

class Bill < ActiveRecord::Base 
    belongs_to :user 
end 

por lo according to RoR guides ya está ansioso-cargado:

No hay necesidad de usar: incluyen por asociaciones inmediatas - es decir, Si usted tiene orden belongs_to: cliente, entonces el cliente es ansioso de cargar automáticamente cuando es necesario.

usted debe comprobar su registro de SQL si es verdad (no sabía que a mí mismo, sólo estaba verificando algo sobre :include a responder que cuando vi esto ... que me haga saber)

+0

creo que es muy dudoso, pero ¿quién sabe? –

+2

_el cliente está ansioso de cargar automáticamente cuando es necesario_ - eso solo significa que, si tiene 1000 pedidos y los itera, llama a 'order1.customer', y' customer1' se carga porque es necesario. Luego accedes a 'order2.customer', pero oye, no dijiste que lo necesitarías, entonces se realizó otra consulta a la base de datos. Pero todavía no sabe que va a necesitar 'customer3' en su próxima iteración, por lo que obtendrá 1000 consultas en lugar de 1. – RocketR

+0

gracias por aclarar eso. Encuentro que esta forma de exponer las cosas es confusa, pero el inglés no es mi lengua materna. –

10

La manera de hacerlo es anulando el método scoped_collection (como se señala en la respuesta de Jeff Ancel) pero llame al super para conservar el alcance existente. De esta forma, conserva el alcance existente y cualquier paginación/filtrado que haya sido aplicado por ActiveAdmin, en lugar de comenzar desde cero.

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 

Como se indica en la documentación oficial en http://activeadmin.info/docs/2-resource-customization.html

+3

Esta debería ser la respuesta aceptada – danielricecodes

Cuestiones relacionadas