Como executar o carregamento antecipado em active_model_serializers
Eu tenho um modelo com várias camadas de associações aninhadas. por exemplo.,
ModelA has_many: model_b
ModelB has_one : model_c
ModelC has_many: model_d
ModelD has_many: model_e
...
Nos serializadores,embed :ids, include: true
é usado para carregamento lateral:
class ModelASerializer < ActiveModel::Serializer
embed :ids, include: true
has_many: model_b
attributes: ...
end
class ModelBSerializer < ActiveModel::Serializer
embed :ids, include: true
...
Quando model_a é renderizado, ele tem um sério "problema n + 1" e gera milhares de chamadas como:
ModelC Load (0.3ms) SELECT "model_cs".* FROM "model_cs" WHERE "model_cs"."id" = $1 LIMIT 1 [["id", "2060c506-8c9c-4d1c-a64c-62455fa18bc4"]]
CACHE (0.0ms) SELECT "model_ds".* FROM "model_ds" WHERE "model_ds"."id" = $1 LIMIT 1 [["id", "2e36f19f-25e1-4953-99ba-f8c0271106dd"]]
CACHE (0.0ms) SELECT "model_es".* FROM "model_es" WHERE "model_es"."id" = $1 LIMIT 1 [["id", "31e53b55-6df6-44cd-98ad-2011cced1e1a"]]
Mesmo que as inclusões sejam especificadas explicitamente, isso não parece ter efeito:
render json: ModelA.includes(:model_bs => [:model_c =>[:model_ds => [:model_es]]])
A documentação do active_model_serializers diz que você deve usar o carregamento antecipado, mas não especifica como eles pretendem que seja feito. As inclusões precisam ser especificadas no serializador? Se sim, como?