ruby-on-rails serialization pagination active-model-serializers

ruby on rails - Rails active_model_serializer con paginación



ruby-on-rails serialization (1)

Estoy usando active_model_serializer. Ahora quiero serializar un objeto con paginación, ¿debo hacer la lógica de paginación en el controlador o en el serializador?

Si elijo hacer la paginación en el serializador, debo pasar el número de página y la página por página al serializador. ¿Cómo debo hacer eso? Mi entendimiento es que el serializador solo toma el objeto modelo.


Solución de un solo uso

Los serializadores regulares solo se ocupan de elementos individuales, no de listas paginadas. La forma más directa de agregar paginación es en el controlador:

customers = Customer.page(params[:page]) respond_with customers, meta: { current_page: customers.current_page, next_page: customers.next_page, prev_page: customers.prev_page, total_pages: customers.total_pages, total_count: customers.total_count }

Solución reutilizable

Sin embargo, esto es bastante tedioso si necesita lógica de paginación para varios objetos. Al revisar la documentación de active_model_serializers, encontrará un ArraySerializer para serializar una matriz de objetos. Lo que hice fue crear pagination_serializer.rb usando ArraySerializer para agregar automáticamente la etiqueta meta para matrices paginadas:

# my_app/app/serializers/pagination_serializer.rb class PaginationSerializer < ActiveModel::Serializer::ArraySerializer def initialize(object, options={}) meta_key = options[:meta_key] || :meta options[meta_key] ||= {} options[meta_key][:pagination] = { current_page: object.current_page, next_page: object.next_page, prev_page: object.prev_page, total_pages: object.total_pages, total_count: object.total_count } super(object, options) end end

Una vez que haya agregado PaginationSerializer a su aplicación de rieles, simplemente necesita llamarlo cuando necesite etiquetas meta de paginación de su controlador:

customers = Customer.page(params[:page]) respond_with customers, serializer: PaginationSerializer

Nota: escribí esto para usar a Kaminari como el paginador. Sin embargo, se puede modificar fácilmente para que funcione con cualquier gema de paginación o solución personalizada.