Стремление загрузить связанные модели в ActiveAdmin SQL-запрос - PullRequest
20 голосов
/ 14 декабря 2011

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

ActiveAdmin.register Bill

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

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

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

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

Ответы [ 3 ]

29 голосов
/ 29 января 2012

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

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

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

26 голосов
/ 27 июня 2016

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

1 голос
/ 15 декабря 2011

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

Я предполагаю, что

class Bill < ActiveRecord::Base
  belongs_to :user
end

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

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

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

...