簡體   English   中英

如何在 active_model_serializers 中執行預先加載

[英]How to perform eager loading in active_model_serializers

我有一個具有多層嵌套關聯的模型。 例如,

ModelA has_many: model_b
ModelB has_one : model_c
ModelC has_many: model_d
ModelD has_many: model_e
  ...

在序列化器中, embed :ids, include: true用於旁加載:

class ModelASerializer < ActiveModel::Serializer
    embed :ids, include: true

    has_many: model_b

    attributes: ...
end

class ModelBSerializer < ActiveModel::Serializer
    embed :ids, include: true
    ...

當 model_a 被渲染時,它有一個嚴重的“n+1 問題”,並且會產生成千上萬的調用,比如:

    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"]]

即使明確指定了包含,它似乎也沒有效果:

render json: ModelA.includes(:model_bs => [:model_c =>[:model_ds => [:model_es]]])

active_model_serializers 文檔說你應該使用預先加載,但沒有指定他們打算如何完成。 是否必須在序列化程序中指定包含? 如果是這樣,如何?

這是一個很好的描述和解釋。 這就是你要找的?

class ModelName
  default_scope includes(:other)
end

如何將`:include` 添加到default_scope?

編輯:

我沒有像您那樣在一系列模型中完成此操作,我已使用序列化程序通過一個級別完成此操作,並且我還使用 jbuilder 來減輕痛苦並通過 2 個級別來利用控制。 我仍然相信你想把這層控制放在模型級別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM