我發現當我使用ActiveModel Serializer爲一組包含關聯的模型生成JSON時,導致大量的SQL查詢(每個關聯一個)。我怎樣才能避免這種情況?如何避免ActiveModel串行器中的多個SQL調用?
我試着做在控制器中包括:
render json: Project.includes(tasks: [:workers])
但這似乎並沒有工作。即使我將關係(包含)直接傳遞給ArraySerializer,也無濟於事。
我發現當我使用ActiveModel Serializer爲一組包含關聯的模型生成JSON時,導致大量的SQL查詢(每個關聯一個)。我怎樣才能避免這種情況?如何避免ActiveModel串行器中的多個SQL調用?
我試着做在控制器中包括:
render json: Project.includes(tasks: [:workers])
但這似乎並沒有工作。即使我將關係(包含)直接傳遞給ArraySerializer,也無濟於事。
我切換到rabl。更細粒度和更好的控制
根據文檔[1],你正在做的事情是正確的。序列化器只關心序列化對象。因此,在調用序列化程序之前,您需要加載所有需要的東西。
1 - https://github.com/rails-api/active_model_serializers#performance
自己嘗試實例化一個串行:
@projects = Project.includes(tasks: [:workers])
render json: ActiveModel::ArraySerializer.new(@projects, each_serializer: ProjectSerializer).to_json
這是一個有點激進,但對於其正在打了很多讓我感動了整個JSON代入數據庫查詢的複雜查詢(我使用的Postgres 9.3支持)。它可能不是最乾淨的解決方案,因爲它需要非常原始的SQL,但速度很快。
我會更新一個例子,如果任何人有興趣。
我發現使用包括在爲我工作的控制器,但你必須小心,你的序列化程序對象不包括不在包含的關係。
而且我發現,如果你指定一個像
has_one :country, embed: :ids, include: false
一比一的關係將取回即使它並不需要另一個對象。相反,我用它代替:
attributes :country_id
我使用的是主動型串行v0.8.3
如果你可以發佈您的整個respond_to代碼塊,並將得到你的日誌的內容,這將是有益的。 – mysmallidea