2011-12-14 2 views
15

Я получил индексную страницу ActiveAdminжадной загрузки связаны модели ActiveAdmin запросов SQL

ActiveAdmin.register Bill 

И я пытаюсь отобразить ссылки на связанные с ними модели

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

Но я бегу в N + 1 запрос - есть запрос на выбор каждого пользователя.

Есть ли способ охотно загружать пользователей счетов?

ответ

26

Eсть ответ на другой пост, но он хорошо описывает, что вам нужно делать здесь.

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

Здесь вам необходимо убедиться, что вы следите за областью действия. Поэтому, если ваш контроллер имеет значение scope_to'ed, вам нужно будет заменить указанное выше имя модели параметром scope_to'ed.

+2

это не paginated = результат может быть огромным – okliv

1

ВАЖНО EDIT Примечание:, что на самом деле следует ложным, увидеть комментарии для объяснения. Однако я оставляю этот ответ там, где он стоит, потому что кажется, что я не единственный, кого путают гиды, так что, возможно, кто-то найдет его полезным.

я считать, что

class Bill < ActiveRecord::Base 
    belongs_to :user 
end 

так according to RoR guides уже нетерпеливо загружены:

Там нет необходимости использовать: включить для непосредственных ассоциаций - то есть, если у вас есть орден belongs_to: клиент, тогда клиент автоматически загружается автоматически, когда это необходимо.

вы должны проверить ваш журнал SQL, если это правда (не знал, что я сам, я просто проверяя что-то о :include, чтобы ответить вам, когда я увидел это ... дайте мне знать)

+0

я думаю, что это очень сомнительно, но кто знает? –

+2

_ клиент загружается автоматически, когда это необходимо - это просто означает, что если у вас 1000 заказов и итерации по ним, вы вызываете 'order1.customer', а' customer1' загружается, потому что это необходимо. Затем вы получаете доступ к 'order2.customer', но, эй, вы не сказали, что вам это понадобится, так что еще один запрос к базе данных. Но он все еще не знает, что вам понадобится 'customer3' на следующей итерации, поэтому вы получите 1000 запросов вместо 1. – RocketR

+0

спасибо за это. Я нахожу этот способ разоблачать вещи, запутывающие, но английский не мой родной язык. –

10

Способ сделать это - переопределить метод scoped_collection (как указано в ответе Джеффа Анселя), но позвоните super, чтобы сохранить существующий объем. Таким образом, вы сохраняете существующий объем и любую разбивку на страницы/фильтрацию, которые были применены ActiveAdmin, а не начинаются с нуля.

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 

Как отмечено в официальной документации на http://activeadmin.info/docs/2-resource-customization.html

+3

Это должен быть принятый ответ – danielricecodes

Смежные вопросы