Нежелательная загрузка связанных моделей в SQL-запросе ActiveAdmin

У меня есть индексная страница ActiveAdmin

ActiveAdmin.register Bill

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

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

Способ сделать это - переопределить метод 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

ВАЖНОЕ ИЗМЕНЕНИЕ ПРИМЕЧАНИЕ. то, что следует на самом деле, false, см. комментарии для объяснения. Однако я оставляю этот ответ там, где он стоит, потому что кажется, что я не единственный, кого путают гиды, поэтому, возможно, кто-то найдет его полезным.

i предположим, что

class Bill < ActiveRecord::Base
  belongs_to :user
end

так в соответствии с инструкциями RoR он уже загружен:

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

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

Ответ 4

Существующие ответы были в то время, но ActiveAdmin теперь поддерживает загрузку с гораздо более удобным синтаксисом:

ActiveAdmin.register Bill do
  includes :user
end

Смотрите документацию по настройке ресурсов.