ruby-on-rails – 与Active Model Serializer相关的负载关联

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 与Active Model Serializer相关的负载关联前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
背景

我有一个具有深度嵌套关联的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 ...

问题

这一切都可以找到,除了没有什么是渴望的.所以它最终会为每个请求调用数据库.对于每周,它会对该周的日子单独提出申请.而对于每一天,它都是单独的请求,它的工作周期,小计和调整.

解决方法

一个解决方案是在TimecardSerializer上定义自己的周方法.从那里你可以包括()你想要加载的所有关联.
class TimecardSerializer < ActiveModel::Serializer
  embed :ids,include: true
  has_many :weeks

  def weeks
    object.weeks.includes(days: [:sub_totals,:work_periods,:adjustments])
  end
end

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

猜你在找的Ruby相关文章