6

我發現當我使用ActiveModel Serializer爲一組包含關聯的模型生成JSON時,導致大量的SQL查詢(每個關聯一個)。我怎樣才能避免這種情況?如何避免ActiveModel串行器中的多個SQL調用?

我試着做在控制器中包括:

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

但這似乎並沒有工作。即使我將關係(包含)直接傳遞給ArraySerializer,也無濟於事。

+0

如果你可以發佈您的整個respond_to代碼塊,並將得到你的日誌的內容,這將是有益的。 – mysmallidea

回答

-1

我切換到rabl。更細粒度和更好的控制

0

自己嘗試實例化一個串行:

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

這是一個有點激進,但對於其正在打了很多讓我感動了整個JSON代入數據庫查詢的複雜查詢(我使用的Postgres 9.3支持)。它可能不是最乾淨的解決方案,因爲它需要非常原始的SQL,但速度很快。

我會更新一個例子,如果任何人有興趣。

0

我發現使用包括在爲我工作的控制器,但你必須小心,你的序列化程序對象不包括不在包含的關係。

而且我發現,如果你指定一個像

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

一比一的關係將取回即使它並不需要另一個對象。相反,我用它代替:

attributes :country_id 

我使用的是主動型串行v0.8.3