Так что я боролся с этим в течение нескольких часов, и я надеюсь, что кто-то может помочь.
У меня 3-уровневые отношения, Список, Страница и Приложение.
Список has_many Страницы Страница принадлежит списку и может при желании принадлежать приложению. Приложение has_many Pages
С таким запросом
@account.lists.includes(pages: :app)
Все работает нормально, у меня нет N + 1 запросов, и все они загружаются правильно
Например,
List Load (3.0ms) SELECT `lists`.* FROM `rotations` WHERE `lists`.`account_id` = 1
Page Load (2.5ms) SELECT `pages`.* FROM `pages` WHERE `pages`.`list_id` IN (13, 17, 18)
App Load (2.0ms) SELECT `apps`.* FROM `apps` WHERE `apps`.`id` IN (6, 9, 15)
Моя проблема в том, что все эти операторы SELECT * FROM
, хотя записи приложений, в частности, довольно тяжелые. В столбце с именем «content» может быть целых HTML документов
Мне действительно нужно иметь возможность только SELECT apps.id, apps.name FROM
приложений .... `. Так что я не загружаю эти полные объекты в память, а просто отбрасываю их все мгновение спустя, когда я рендую только идентификаторы и имена.
Я бы выполнил это вручную, хотя я не могу заставить его работать с ActiveModelSerializer.
Мои сериализаторы довольно стандартны. Список со списком has_many: pages и страницей, принадлежащей_to: app.
Как извлечь атрибуты select только из одной из моих вложенных ассоциаций? Я уверен, что могу использовать joins()
, но я не уверен, как это работает с моими сериализаторами?
Приветствия