2014-01-03 2 views
1

В настоящее время у меня есть следующие сериализаторы:Кэширование ассоциации в активной модели сериализаторах

class UserSerializer < ActiveModel::Serializer 
    cached 
    delegate :cache_key, to: :object 
    has_many :profiles 
end 

class ProfileSerializer < ActiveModel::Serializer 
    cached 
    delegate :cache_key, to: :object 
    has_many :pages 
end 

class PageSerializer < ActiveModel::Serializer 
    cached 
    delegate :cache_key, to: :object 
    has_many :posts 
end 

По разным причинам, мне нужно сериализовать все связанные профили, страниц и сообщений при сериализации моей модели пользователя. К сожалению, это приводит к довольно большому хэшу JSON, который трудно кэшировать эффективно - мой локальный сервер memcached может хранить только около 75 сериализованных пользователей. Есть ли способ настроить сериализаторы, чтобы вместо кэширования вывода всей пользовательской модели JSON я только кешировал уникальные части JSON и фиксировал другую выборку кэша для получения сериализованных данных для связанных профилей, страниц и должности?

ответ

0

Я не думаю, что есть способ сделать это в пределах ActiveModel::Serializers. Вы можете уменьшить размер кеша за счет усложнения кода. Что-то вроде этого будет работать:

user_json = UserSerializer.new(@user).as_json 
user_json[:profiles] = @user.profiles.map { |profile| ProfileSerializer.new(profile).as_json } 
etc. 

В вашем примере, конечно, потребуется больше вложенности.

Это не отличное решение - если вы обязаны возвращать глубоко вложенные JSON, я думаю, что лучшим краткосрочным вариантом было бы добавить еще больше возможностей memcache. Долгосрочным было бы целесообразно переосмыслить этот подход, поскольку, возможно, было бы нецелесообразно возвращать все сразу.

Смежные вопросы