我在控制器的索引方法中遇到了多个数据库查询的问题。基本上,我正在渲染一个由ActiveModelSerializer首先序列化的JSON,见下文:
def index
packs = Pack.editable_by(current_user)
render json: packs, each_serializer: PackSerializer, include: :documents, root: false
end
所以,pack数组中的每个包都由它序列化。序列化程序本身依赖于关联(一个包可以有很多文档),这就是为什么我添加了include: :documents
以便它被急切加载并避免N + 1查询。
不幸的是它没有用。
在这种情况下有谁知道如何避免N + 1查询?
PackSerializer
大致如下所示:
class PackSerializer < ActiveModel::Serializer
attributes #some attributes
def doc_title
@object.latest_document.title
end
...
end
class Pack < ActiveRecord::Base
...
def latest_document
documents.where(is_published: true).order(:created_at).last
end
...
end
答案 0 :(得分:0)
我认为在查询之前包含documents
就足够了,所以
def index
packs = Pack.editable_by(current_user).includes(:documents)
render json: packs, each_serializer: PackSerializer, root: false
end