【问题标题】:How to avoid multiple SQL calls in ActiveModel Serializers?如何避免 ActiveModel 序列化程序中的多个 SQL 调用?
【发布时间】:2013-07-28 13:09:55
【问题描述】:

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

我尝试在控制器中包含:

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

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

【问题讨论】:

  • 如果您可以发布整个 respond_to 块以及日志的结果内容,那将会很有帮助。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        attributes :country_id
        

        我正在使用 Active Model Serializer v0.8.3

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2014-11-08
            • 1970-01-01
            • 1970-01-01
            • 2021-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-09
            • 2018-04-04
            相关资源
            最近更新 更多