渴望与Active Model Serializers加载关联
背景
我有一个带有深层嵌套关联的rails应用程序。
.-< WorkPeriod Timecard -< Week -< Day -<--< Subtotal `-< Adjustment -< (has many)
我正在使用Active Model Serializer来构建API。
在客户端,我想一次性加载时间卡及其所有关联。
目前我的序列化器看起来像这样,
class TimecardSerializer < ActiveModel::Serializer embed :ids, include: true has_many :weeks end class WeekSerializer < ActiveModel::Serializer embed :ids, include: true has_many :days end # ... etc ...
问题
这一切都找到了,除了没有任何东西急切加载。 因此,它最终会针对每个请求对数据库进行大量调用。 对于每周,它会单独请求该周的日期。 并且对于每一天,它单独请求它的work_periods,小计和调整。
一种解决方案是在TimecardSerializer上定义您自己的weeks
方法。 从那里你可以.includes()
你想要加载的所有关联。
class TimecardSerializer < ActiveModel::Serializer embed :ids, include: true has_many :weeks def weeks object.weeks.includes(days: [:sub_totals, :work_periods, :adjustments]) end end
所有查询仍将显示在日志中,但大多数将是缓存查询而不是真实查询。
我有一个类似的问题。 我把它固定在我的控制器上。 我喜欢把它放在序列化器中的想法,但是在控制器中使用它也会捕获由ArraySerializer创建的n + 1周问题。
Timecard.find(params[:id]).includes(weeks: [{ days: [:sub_totals, :work_periods, :adjustments] }])
和
Timecard.includes(weeks: [{ days: [:sub_totals, :work_periods, :adjustments] }])
现在应该急于加载并将查询限制为仅6个db命中。
- 在Rails中使用ActiveModel :: Serializer – JSON数据在json和index响应之间有所不同
- ActiveModel :: Serializer无法正常工作
- 活动模型序列化器和自定义JSON结构
- 更改活动模型序列化器默认适配器
- 如何在active_model_serializers中执行预先加载
- 版本控制ActiveModel :: Serializer
- 如何为活动模型序列化器关系选择所需的属性
- <NoMethodError:#Record :: ActiveRecord_Relation的未定义方法`read_attribute_for_serialization':
- 使用ActiveModel :: Serializer序列化具有属性的数组/关系