6

我发现当我使用 ActiveModel 序列化器为一组包含关联的模型生成 JSON 时,会产生大量 SQL 查询(每个关联一个)。我怎样才能避免这种情况?

我试图在控制器中包含一个:

render json: Project.includes(tasks: [:workers])

但这似乎不起作用。即使我将关系(包含)直接传递给 ArraySerializer 它也无济于事。

4

5 回答 5

1

这有点激进,但是对于受到很多打击的复杂查询,我将整个 JSON 生成移到了数据库查询中(我使用的是支持该功能的 Postgres 9.3)。它可能不是最干净的解决方案,因为它需要非常原始的 SQL,但速度很快。

如果有人感兴趣,我会用一个例子来更新。

于 2014-07-17T00:36:35.080 回答
0

尝试自己实例化一个序列化器:

@projects = Project.includes(tasks: [:workers])
render json: ActiveModel::ArraySerializer.new(@projects, each_serializer: ProjectSerializer).to_json
于 2014-04-20T07:51:22.890 回答
0

根据文档[1],您正在做正确的事情。序列化器只关心序列化对象。因此,在调用序列化程序之前,您需要预先加载所需的所有内容。

1 - https://github.com/rails-api/active_model_serializers#performance

于 2013-12-13T14:12:17.113 回答
0

我发现在控制器中使用包含对我有用,但您必须小心您的序列化程序对象不包含不在包含中的关系。

我还发现如果您指定一对一的关系,例如

has_one :country, embed: :ids, include: false

即使不需要,它也会获取另一个对象。相反,我将其替换为:

attributes :country_id

我正在使用 Active Model Serializer v0.8.3

于 2016-01-24T12:43:52.127 回答
-1

我切换到rabl。更细化和更好的控制

于 2013-10-02T16:15:38.077 回答