如何使用ActiveModel :: Serializers(v0.10.0.rc1)

时间:2015-06-15 17:37:41

标签: caching active-model-serializers rails-api

我正在使用数据库驱动的标签和翻译解决方案,我想在序列化程序级别进行缓存。这是我的序列化器。

class AppLabelSerializer < ActiveModel::Serializer
  cache key: 'app_label', expires_in: 3.hours
  attributes :id, :key, :label, :label_plural

  def key
    object.app_label_dictionary.key
  end
end

问题是我需要缓存每种语言的标签,所以我需要在密钥的某处指定语言。我试过这个解决方案:

cache key: "#{scope.app_language.name}/app_label", expires_in: 3.hours

但由于某种原因,scope的值不可用。

1 个答案:

答案 0 :(得分:3)

我发布了an issue on the AMS github page并与@joaomdmoura和@groyoh来回走动,直到我们想出了这个临时解决方案。它适用于我的目的,它现在要做,直到AMS正式决定最佳解决方案。

module ActiveModel
  class Serializer
    class Adapter
      def cache_key
        key = @klass._cache_key
        key = @cached_serializer.instance_exec &key if key.is_a?(Proc)
        key ? "#{key}/#{@cached_serializer.object.id}-#{@cached_serializer.object.updated_at}" : @cached_serializer.object.cache_key
      end
    end
  end
end

class AppLabelSerializer < ActiveModel::Serializer
  cache key: ->(){ "#{scope.app_language.name}/app_labels" }, expires_in: 3.hours
  attributes :id, :label, :label_plural    
end

看起来很有趣,但是您只需将ActiveModel模块的扩展名粘贴到您现有的序列化程序文件中即可。

注意:这仅适用于v0.10.0.rc1