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
你没有做错任何事...事实上,我花了一个多星期的时间来弄清楚为什么这不起作用,我发现 AMS 缓存不适用于旁加载关系...
但如果您想继续找出问题所在...那么请看看我们使用 AMS 缓存问题中找到的信息来解决此特定问题而制作的AMS 分支...
需要注意的一件事...通过使用这个 gem,我们能够减少查询集合所花费的时间...但它几乎对加载 1 个对象没有影响...仅集合...并且我们能够减少一些收集时间从 75% 减少到 10% 我知道仅减少 10% 并不是那么好...这就是为什么我们现在(3 天前)转向JBuilder ...老实说,我没有弄清楚它的缓存是如何工作的
关于 jbuilder 和缓存时间...使用 jbuilder 和适当的部分缓存(片段缓存),当集合未缓存时,我们能够获得大约 40 毫秒的响应时间,而当集合被缓存时,我们能够获得大约 15 毫秒的响应时间...缓存之前的响应时间大约130毫秒(因为片段缓存不会使整个对象及其关系无效......只有更改的部分)......所以我建议使用jbuilder与演示者层(如Draper gem)和jbuilder多缓存以获得更好的集合缓存
| 归档时间: |
|
| 查看次数: |
2385 次 |
| 最近记录: |