class ApplicationSerializer include Rails.application.routes.url_helpers class CollectionSerializer < ApplicationSerializer def initialize(items, serializer, opts = {}) super(items, opts) @collection_name = 'list' @serializer = serializer end def serialize list = @item.map { |i| @serializer.for(i).serialize } if @collection_name && item.respond_to?(:total_pages) { totalCount: item.total_count, totalPages: item.total_pages, currentPage: item.current_page, pageSize: item.limit_value, @collection_name.to_sym => list } else list end end end def self.for(data, opts = {}) if data.respond_to?(:each) CollectionSerializer.new(data, self, opts) else new(data) end end attr_reader :item def initialize(item, opts = {}) @item = item @options = opts end def item_properties(*keys) Hash[keys.map { |k| [k.to_sym, @item.send(k.to_sym)] }] end def serialize @item.as_json end def as_json(*args) serialize end def to_json(*args) Rails.cache.fetch(@item.cache_key, version: @item.cache_version) do self.as_json(*args).to_json end end end