缓存序列化程序,无法缓存关联

Mar*_*var 6 ruby-on-rails active-model-serializers ruby-on-rails-4

我正在尝试使用Active Model Serializer实现一些缓存; 这是我的序列化器.

class ServiceFieldSerializer < ActiveModel::Serializer
  attributes :id, :name, :description, :meta_description, :content, :practitioner_term, :avatar, :slug
  has_many :services
  embed :id, include: true

  cached
  delegate :cache_key, to: :object

  def services
    object.services.published
  end

  def avatar
    object.image_url :avatar if object.image.present?
  end
end
Run Code Online (Sandbox Code Playgroud)

服务序列化器

class ServiceSerializer < ActiveModel::Serializer
  attributes :id, :name, :description, :meta_description, :content, :practitioner_term, :avatar, :slug
  has_one :service_field
  embed :id

  cached
  delegate :cache_key, to: :object

  def avatar
    object.image_url :avatar if object.image.present?
  end
end
Run Code Online (Sandbox Code Playgroud)

输出"y ServiceSerializer.new(Service.first)"

object: !ruby/ActiveRecord:Service
  attributes:
    id: 4
    name: ADHD Coaching
    description: Bliv klogere på hvorfor du har det damp i hovede
    service_field_id: 2
    created_at: 2014-02-18 08:08:41.755177000 Z
    updated_at: 2014-04-29 08:30:44.111671000 Z
    content: tihihi
    image:
    published: true
    meta_description:
    slug: adhd-coaching
    practitioner_term:
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我有缓存调用时,我的json响应看起来像这样.

service_fields: []->
0: {id:2, name:Coaching, description:Det bliver du glad for, meta_description:, content:,…}
1: {id:1, name:Massage, description:Massage er godt for krop og alt i hele verden., meta_description:null,…}
2: {id:3, name:Terapi, description:Noget med nogle møder, meta_description:null,…}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,相关服务缺失,如果我从序列化程序中删除了缓存,那么服务就在那里.

我究竟做错了什么?

Rails版本:4.0.5

AMS版本:0.8.1

a14*_*14m 2

你没有做错任何事...事实上,我花了一个多星期的时间来弄清楚为什么这不起作用,我发现 AMS 缓存不适用于旁加载关系...

但如果您想继续找出问题所在...那么请看看我们使用 AMS 缓存问题中找到的信息来解决此特定问题而制作的AMS 分支...

需要注意的一件事...通过使用这个 gem,我们能够减少查询集合所花费的时间...但它几乎对加载 1 个对象没有影响...仅集合...并且我们能够减少一些收集时间从 75% 减少到 10% 我知道仅减少 10% 并不是那么好...这就是为什么我们现在(3 天前)转向JBuilder ...老实说,我没有弄清楚它的缓存是如何工作的

编辑

关于 jbuilder 和缓存时间...使用 jbuilder 和适当的部分缓存(片段缓存),当集合未缓存时,我们能够获得大约 40 毫秒的响应时间,而当集合被缓存时,我们能够获得大约 15 毫秒的响应时间...缓存之前的响应时间大约130毫秒(因为片段缓存不会使整个对象及其关系无效......只有更改的部分)......所以我建议使用jbuilder与演示者层(如Draper gem)和jbuilder多缓存以获得更好的集合缓存