我正在使用数据库驱动的标签和翻译解决方案,我想在序列化程序级别进行缓存。这是我的序列化器。
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
的值不可用。
答案 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