2015-06-15 3 views
2

Я использую решение, основанное на базе данных для меток и переводов, которые я хотел бы кэшировать на уровне сериализатора. Вот мой сериализатор.Как использовать динамическое значение ключа кэша с помощью 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 не доступна там по какой-то причине.

ответ

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

+0

Почему у вас есть как метод экземпляра для ключа и прок? Оба подхода поддерживаются monkeyhack, или вам нужно использовать оба метода? –

+0

Вам не нужны оба. Метод 'key', который я определял, был всего лишь ключевым полем AppLabel, и мне нужно было его переопределить. Я удалил его из примера, потому что он был ненужным и запутанным. Отвечает ли это на ваш вопрос? –