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