Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 缓存序列化程序,无法缓存关联_Ruby On Rails_Ruby On Rails 4_Active Model Serializers - Fatal编程技术网

Ruby on rails 缓存序列化程序,无法缓存关联

Ruby on rails 缓存序列化程序,无法缓存关联,ruby-on-rails,ruby-on-rails-4,active-model-serializers,Ruby On Rails,Ruby On Rails 4,Active Model Serializers,我试图用活动模型序列化器实现一些缓存;这是我的序列化程序 class ServiceFieldSerializer < ActiveModel::Serializer attributes :id, :name, :description, :meta_description, :content, :practitioner_term, :avatar, :slug has_many :services embed :id, include: true cached

我试图用活动模型序列化器实现一些缓存;这是我的序列化程序

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
我的问题是,当我有缓存调用时,我的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,…}
正如您所看到的,关联的服务丢失了,如果我从序列化程序中删除缓存,服务就在那里

我做错了什么

Rails版本:4.0.5


AMS版本:0.8.1

您没有做错任何事。。。事实上,我花了一个多星期的时间来解释为什么这不起作用,我发现AMS缓存不能处理侧载关系

但是如果你想继续找出问题所在。。。然后看看我们使用AMS缓存问题中的信息来解决这个特定问题

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

编辑
关于jbuilder和缓存时间。。。使用jbuilder和适当的部分缓存(片段缓存),我们能够在集合未缓存时获得大约40毫秒的响应时间,在缓存时获得大约15毫秒的响应时间。。。缓存之前的响应时间约为130ms(因为片段缓存不会使整个对象及其关系无效…只有更改的部分)。。。因此,我建议使用带有presenter层(如)的jbuilder,并且为了更好地缓存集合,我在google上找到了这篇文章,它似乎通过手动片段缓存解决了这个问题

@services_fields = ServiceField.includes(:services)
json = Rails.cache.fetch 'test' do
  ActiveModel::Serializer.build_json(self, @services_fields, {}).to_json
end

respond_with json
它呈现正确的JSON


请随意发布备选方案。

您是否尝试清除缓存,只是为了确保不会以某种方式获取旧的缓存值?我多次重新启动了memcached是的,并盯着日志,是的:)。不必唠叨,但您是否有可能在测试时不使用memcached?也许您正在使用默认的文件存储?缓存设置为delli'config.cache\u store=:dalli\u store',并执行缓存。正如我所写的,我可以在日志中看到缓存也正在被写入,并且在重新启动memcached时它会重置。:-)@MartinElvar serializer ServiceSerializer是否在场?我很害怕,目前AMS回购似乎相当安静。出于好奇,与AMS相比,JBuilder的性能提升了多少?因为随着我的应用程序变得越来越复杂,我面临着一些令人不快的加载时间,即使是迫不及待的加载。在接受您的答案之前,我会给这个问题更多的时间,可能是一个碰巧知道修复方法的人:)。是的。。。这就是为什么我们在asknative:D中的每一个新项目中都迁移到JBuilder。。。而且我添加这个答案并不是为了得到赏金或者其他什么。。。我加上这个是为了得到关于我的结论的反馈,即AMS真的很慢,特别是在侧载关系方面。。。我无法判断JBuilder的性能。。。事实上,我正在努力掌握它,并有一个工作的东西,并运行。。。我使用它的经验不到一周,但似乎promisingI可以看到您也在使用Emberjs,所以相同的故事:)。对于我将近1.5秒的加载,我最终为重型模型创建了一个预览序列化程序;我在索引操作中使用它,它可以让我获得大约60%的性能增益,如果您需要显示所有内容,它将不会有帮助。目前,我们没有时间将json序列化程序切换到jbuilder,但如果AMS完全失控,我将对此进行研究。:)试试叉子。。。你应该走上解决问题的道路。。。如果你发现了什么,请把PR添加到叉子上,因为我们非常需要使用AMS正确地完成这项工作
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,…}
@services_fields = ServiceField.includes(:services)
json = Rails.cache.fetch 'test' do
  ActiveModel::Serializer.build_json(self, @services_fields, {}).to_json
end

respond_with json