如何在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
用于sideloading:
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个级别来控制控制。 我仍然相信你想把这层控制放在模型层面上。
- 如何使用active_model_serializers为嵌套对象选择序列化程序
- <NoMethodError:#Record :: ActiveRecord_Relation的未定义方法`read_attribute_for_serialization':
- Active Model Serializers:nil的未定义方法`url_for’:NilClass
- Url Helper在ActiveModelSerializer 0.10.0中?
- 更改活动模型序列化器默认适配器
- ActiveModel :: Serializers Gem – Versioned API命名空间问题
- Ember Data属于协会(JSON格式?)
- 使用Rspec测试ActiveModel :: Serializer类
- 使用active_model_serializers序列化权限(例如CanCan)