Нежелательная загрузка связанных моделей в 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
Смотрите документацию по настройке ресурсов.