我发现当我使用 ActiveModel 序列化器为一组包含关联的模型生成 JSON 时,会产生大量 SQL 查询(每个关联一个)。我怎样才能避免这种情况?
我试图在控制器中包含一个:
render json: Project.includes(tasks: [:workers])
但这似乎不起作用。即使我将关系(包含)直接传递给 ArraySerializer 它也无济于事。
我发现当我使用 ActiveModel 序列化器为一组包含关联的模型生成 JSON 时,会产生大量 SQL 查询(每个关联一个)。我怎样才能避免这种情况?
我试图在控制器中包含一个:
render json: Project.includes(tasks: [:workers])
但这似乎不起作用。即使我将关系(包含)直接传递给 ArraySerializer 它也无济于事。
这有点激进,但是对于受到很多打击的复杂查询,我将整个 JSON 生成移到了数据库查询中(我使用的是支持该功能的 Postgres 9.3)。它可能不是最干净的解决方案,因为它需要非常原始的 SQL,但速度很快。
如果有人感兴趣,我会用一个例子来更新。
尝试自己实例化一个序列化器:
@projects = Project.includes(tasks: [:workers])
render json: ActiveModel::ArraySerializer.new(@projects, each_serializer: ProjectSerializer).to_json
根据文档[1],您正在做正确的事情。序列化器只关心序列化对象。因此,在调用序列化程序之前,您需要预先加载所需的所有内容。
1 - https://github.com/rails-api/active_model_serializers#performance
我发现在控制器中使用包含对我有用,但您必须小心您的序列化程序对象不包含不在包含中的关系。
我还发现如果您指定一对一的关系,例如
has_one :country, embed: :ids, include: false
即使不需要,它也会获取另一个对象。相反,我将其替换为:
attributes :country_id
我正在使用 Active Model Serializer v0.8.3
我切换到rabl。更细化和更好的控制