如何使用 ActiveModel::Serializers 缓存键的动态值 (v0.10.0.rc1)

How to use a dynamic value for cache key with ActiveModel::Serializers (v0.10.0.rc1)

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

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 的值在那里不可用。

我发布了 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