如何避免ActiveModel Serializers中的多个SQL调用?

时间:2013-07-28 19:59:25

标签: ruby-on-rails json serialization active-model-serializers

我发现当我使用ActiveModel Serializers为一组包含关联的模型生成JSON时,会导致大量的SQL查询(每个关联一个)。我怎么能避免这个?

我试过在控制器中做一个include:

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

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

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

@projects = Project.includes(tasks: [:workers])
render json: ActiveModel::ArraySerializer.new(@projects, each_serializer: ProjectSerializer).to_json

答案 3 :(得分:0)

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

我还发现你是否指定了一对一的关系,比如

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

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

attributes :country_id

我正在使用Active Model Serializer v0.8.3

答案 4 :(得分:-1)

我转向了拉布尔。更细粒度和更好的控制