Ruby on rails 与活动模型序列化程序的即时加载关联 背景

Ruby on rails 与活动模型序列化程序的即时加载关联 背景,ruby-on-rails,performance,associations,eager-loading,active-model-serializers,Ruby On Rails,Performance,Associations,Eager Loading,Active Model Serializers,我有一个具有深层嵌套关联的rails应用程序 .-< WorkPeriod Timecard -< Week -< Day -<--< Subtotal `-< Adjustment -< (has many) -

我有一个具有深层嵌套关联的rails应用程序

                          .-< WorkPeriod
Timecard -< Week -< Day -<--< Subtotal
                          `-< Adjustment

-<  (has many)
-Timecard-weeks
方法。从那里可以
.includes()
加载所有要加载的关联

class TimecardSerializer

所有查询仍将显示在日志中,但大多数查询将是缓存查询,而不是真实查询。

我也遇到过类似问题。我把它固定在我的控制器上。我喜欢将它放在序列化程序中的想法,但将它放在控制器中也会抓住ArraySerializer造成的n+1周问题

Timecard.find(params[:id]).includes(weeks: [{ days: [:sub_totals, :work_periods, :adjustments] }])


现在应该立即加载,并将查询限制为仅六个db命中。

这对于加载单个资源很好,但如果使用此序列化程序返回
时间卡的列表,则将不起作用。特别是,
weeks
不会被急切地加载,尽管
weeks
关联会被加载。您不能在实例上调用include,您应该执行
Timecard。其中(id:params[:id])包括(…)
Timecard.includes(weeks: [{ days: [:sub_totals, :work_periods, :adjustments] }])